You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

子组件无法通过父组件Ref更新,Prop类型校验失败

问题分析与解决方案

核心问题

WebSocket回调接收的match数据实际结构不符合DecryptoMatchFake接口定义,导致matchInfo.teams[DecryptoTeam.Blue]为undefined,传递给子组件时触发类型校验警告。而手动按钮触发的逻辑因数据严格遵循接口构造,所以无异常。

排查与修复步骤

  1. 确认推送数据的真实结构
    在SignalR的StateChanged回调中添加日志,打印实际收到的match数据:

    connection.on("StateChanged", (match: DecryptoMatchFake) => {
      console.log("Received match data:", match); // 查看teams的实际结构
      matchInfo.value = match;
      loading.value = false;
    });
    

    重点检查:

    • teams对象是否包含DecryptoTeam.Blue(数值为2)对应的键
    • 该键对应的值是否是包含players属性的有效对象
  2. 添加数据校验与兜底逻辑
    赋值给matchInfo前,先校验数据完整性,避免无效数据流入组件:

    connection.on("StateChanged", (match: DecryptoMatchFake) => {
      // 校验teams结构,确保各队数据有效
      const validMatch = {
        ...match,
        teams: {
          [DecryptoTeam.Unknown]: match.teams[DecryptoTeam.Unknown] || { players: {} },
          [DecryptoTeam.Red]: match.teams[DecryptoTeam.Red] || { players: {} },
          [DecryptoTeam.Blue]: match.teams[DecryptoTeam.Blue] || { players: {} },
        }
      };
      matchInfo.value = validMatch;
      loading.value = false;
    });
    
  3. 模板中用可选链避免深层访问报错
    修改模板里的v-for部分,通过可选链操作符?.处理可能的undefined:

    <p v-for="player in matchInfo.teams[DecryptoTeam.Blue]?.players" :key="player">{{player}}</p>
    

    也可配合v-if提前判断:

    <div v-if="matchInfo.teams[DecryptoTeam.Blue]" class="block-center">
      <p v-for="player in matchInfo.teams[DecryptoTeam.Blue].players" :key="player">{{player}}</p>
    </div>
    
  4. 适配后端数据格式(若键类型不匹配)
    如果后端返回的teams键是字符串(如"Blue"而非数值2),需调整接口或转换键:

    • 调整接口定义:
      interface DecryptoMatchFake {
        round: number;
        teams: { [key in keyof typeof DecryptoTeam]: TeamFake };
      }
      
    • 访问时使用字符串键:
      <p v-for="player in matchInfo.teams['Blue'].players">{{player}}</p>
      

内容的提问来源于stack exchange,提问作者Rincew1nd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 19:51:03