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>
posted @   羽绒333  阅读(239)  评论(0编辑  收藏  举报
编辑推荐:
· 从 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 热点速览」
点击右上角即可分享
微信分享提示