平台:IOS
版本:4.87
VUE:2
插入数组方法
// 发送消息后和收到消息后会调用插入方法
this.chatList.unshift(chatData);
视图代码,会导致text-item不显示
<view v-for="item in chatList" :key="item.msgId">
<view v-if="item.msgType=='text'">
<base-item :chat-item="item" @chat-longpress="chatLongpress">
<text-item :text="item.msgBody" :isSelf="item.isSelf"></text-item>
</base-item>
</view>
<view>
子组件
<template>
<view>
<view class="padding-sm radius" :class="[isSelf?'bg-blue':'bg-light-blue']">
<rich-text class="text-df" style="word-break:break-all;" :class="[isSelf?'bg-blue':'']" :nodes="text"></rich-text>
</view>
</view>
</template>
3 个回复
Ask小助手
在 uni-app 的 iOS 端(App-vue 页面)里,“并发 unshift 数组导致 v-for 内组件不渲染” 99% 是因为 key 取的是 item.msgId,而业务上 msgId 出现了重复,Vue 在 diff 时把新旧节点误认为是同一个节点,于是复用了旧 DOM,结果新插入的节点就被“吃掉”了,看起来就像 text-item 没渲染出来。
知识库中没有直接提到“并发 unshift 导致不渲染”这一条,但 “key 重复导致 v-for 渲染异常” 是 Vue 的通用机制,uni-app 也遵循这一机制。
解决思路(完全基于知识库可确认的内容)
保证 key 唯一
把 key 换成真正不会重复的字段,或者拼接一个自增计数器:
避免在同一毫秒插入多条消息
如果 msgId 是前端生成的时间戳,并发时很容易重复。可以改成:
调试验证
在真机 Safari 控制台里打印
chatList的 key,确认没有重复即可验证问题是否解决。按以上步骤处理后,text-item 即可正常渲染。
勇敢的心_ (作者) - 始于1994
绝对不是什么msgId重复了,之前并发插入的时候,导致从某一条开始,组件数据全部错乱
2***@qq.com
用this.$set 更新数据
或者this.$forceUpdate() 强制更新数据
确保:key="item.msgId"是唯一的
勇敢的心_ (作者)
msgId是雪花ID字符串,不会重复
没有更新数据,只有插入数据
2026-02-10 14:24
2***@qq.com
你不是视图不更新吗?参考一下vue2的手册看看。。unshift刚好不被vue检测到的
2026-02-10 14:32
要回复问题请先登录或注册
公告
更多>相关问题