Javascript 拼接无法正常工作我的对象列表VueJs
我有一个对象数组,但当我想从数组列表中删除一个对象时,只会从末尾删除项目 Html:Javascript 拼接无法正常工作我的对象列表VueJs,javascript,typescript,vuejs2,Javascript,Typescript,Vuejs2,我有一个对象数组,但当我想从数组列表中删除一个对象时,只会从末尾删除项目 Html: <div id="app"> <table> <tr> <td><input type="text" name="test1" /></td> <td> <button class="btn" @click="addrow">add row</button&g
<div id="app">
<table>
<tr>
<td><input type="text" name="test1" /></td>
<td>
<button class="btn" @click="addrow">add row</button>
</td>
</tr>
<tr v-for="(row,index) in rows">
<td><input type="text" name="test2" /></td>
<td>
<button class="btn" @click="removerows(index)">remove </button>
</td>
</tr>
</table>
</div>
拼接(索引,1)工作不正常,每次删除仅删除最后一个元素,实时演示:我想您可能误解了发生的情况:
VueJS中有一种缓存方法,允许重用生成的现有组件: -渲染(在DOM级别)时,每个对象都被视为相等 因此,VueJS删除最后一行,因为它可能需要最少的计算,然后重新计算预期状态。这有许多附带情况(有时,不重新计算本地状态)。要避免这种情况:按照文档中的建议,使用
:key
跟踪对象的id。从文件中:
当Vue更新使用v-for渲染的元素列表时,默认情况下,它使用“就地修补”策略。如果数据项的顺序已更改,Vue不会移动DOM元素以匹配项的顺序,而是将每个元素修补到位,并确保它反映了在该特定索引处应呈现的内容。这类似于Vue 1.x中track by=“$index”的行为
此默认模式非常有效,但仅适用于列表渲染输出不依赖子组件状态或临时DOM状态(例如表单输入值)的情况
要给Vue一个提示,使其能够跟踪每个节点的标识,从而重用和重新排序现有元素,您需要为每个项提供唯一的键属性。键的理想值是每个项目的唯一id。这个特殊属性大致相当于1.x中的track by,但它的工作方式与属性类似,因此需要使用v-bind将其绑定到动态值
临时DOM状态:这里它指的是你的行为
这是您更正的代码(关联的fiddle:):
HTML:
<div id="app">
<table>
<tr>
<td><input type="text" name="test1" /></td>
<td><button class="btn" @click="addrow">add row</button></td>
</tr>
<tr v-for="(row,index) in rows" :key="row.id">
<td><input type="text" name="test2"/></td>
<td><button class="btn" @click="removerows(index)" >remove </button></td>
</tr>
</table>
</div>
在此代码中:
- 我纠正了
从未递增的事实计数器行
- 我添加了一个
:键
的文档:键
:
下面是另一个JSFIDLE,其中包含:
- 添加v模型
- 在表单下方显示数据
- 更正了
从未递增的事实计数器行
- 添加
:键
<div id="app">
<table>
<tr>
<td><input type="text" name="test1" /></td>
<td><button class="btn" @click="addrow">add row</button></td>
</tr>
<tr v-for="(row,index) in rows" :key="row.id">
<td><input type="text" name="test2"/></td>
<td><button class="btn" @click="removerows(index)" >remove </button></td>
</tr>
</table>
</div>
new Vue({
el: "#app",
data: {
counterrow:1,
rows:[],
},
methods: {
addrow:function(){
this.counterrow += 1;
this.rows.push({
id:this.counterrow,
model: ""
});
},
removerows:function(index){
this.rows.splice(index,1);
},
},
});