v-for删除自定义组件的坑
问题描述
本质描述:当删除自定义组件的时候,总是删除最后一个组件。删除方法是 splice(index, 1);
普通描述:自定义了一个单选题组件,比如是radio.vue。在createSurvey.vue中引入了该组件,创建了三个相同的radio组件,每个radio.vue设置了不同的选项。
出现的场景
v-for嵌套自定义的子组件,才会出现以上问题。
原因
1、当 Vue.js 用 v-for 正在更新已渲染过的元素列表时,它默认用“就地复用”策略。
2、如果数据项的顺序被改变,Vue 将不会移动 DOM 元素来匹配数据项的顺序, 而是简单复用此处每个元素,并且确保它在特定索引下显示已被渲染过的每个元素。
3、为了给 Vue 一个提示,以便它能跟踪每个节点的身份,从而重用和重新排序现有元素,你需要为每项提供一个唯一 key 属性。理想的 key 值是每项都有的唯一 id。
解决:每次新增一个自定义组件,都要单独设置一个独一无二的myid(myid是我自定义的一个名称)
//显示所有的组件和删除按钮。一个组件有一个删除按钮。
<div v-for="(item,index) in questionComponent" :key="item.myid" > <!-- -->
<li v-bind:is="item.newCom" ></li> <!--使用v-bind:is,只能显示组件-->
<el-button type="" @click="delQuesion(index)"></el-button>
</div>
//每个组件都有一个独一无二的myid
questionComponent: [
{
myid:1,
newCom:radio
}
]
//每次生成新组件的操作,必须得生成一个新的myid
setRadio: function () { //生成一个单选题 radio
let size=this.questionComponent.length+1;
var json={
myid:size,
newCom:radio
};
this.questionComponent.push(json);
}
//删除
delQuesion: function (index) {
this.questionComponent.splice(index, 1);
},
:key的位置需要放正确。
正确
<div v-for="(item,index) in questionComponent" :key="item.myid" > <!-- -->
<li v-bind:is="item.newCom" ></li> <!--使用v-bind:is,只能显示组件-->
<el-button type="" @click="delQuesion(index)"></el-button>
</div>
错误
<div v-for="(item,index) in questionComponent" > <!-- -->
<li v-bind:is="item.newCom" :key="item.myid" ></li> <!--使用v-bind:is,只能显示组件-->
<el-button type="" @click="delQuesion(index)"></el-button>
</div>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」