已知,用index作为v-for循环渲染列表的key值是不建议的
一般情况下,如果是查询列表,我是把id值绑定为key的
但如果是前端动态生成的列表,在第一次新建的时候,该列表是没有id值的
(需要第一次保存之后再查询,后台接口会返回id值)
再加上列表组件新建和查询的时候是公用的同一个组件(只是初始化的list的值不同),那么在第一次新建的时候没有id值,此时该如何处理呢?
<ul>
<li v-for="i in list" :key="i.id"></li>
</ul>
已知,用index作为v-for循环渲染列表的key值是不建议的
一般情况下,如果是查询列表,我是把id值绑定为key的
但如果是前端动态生成的列表,在第一次新建的时候,该列表是没有id值的
(需要第一次保存之后再查询,后台接口会返回id值)
再加上列表组件新建和查询的时候是公用的同一个组件(只是初始化的list的值不同),那么在第一次新建的时候没有id值,此时该如何处理呢?
<ul>
<li v-for="i in list" :key="i.id"></li>
</ul>
在下倒有一个万能的雕虫小技:
data(){
return {
idStore: new WeakMap(),
idSeed: 0
}
},
filters: {
allocId(item){
const { idStore } = this;
const curId = idStore.get(item);
if(curId) return curId;
const nextId = ++ this.idSeed;
idStore.set(item, nextId);
return nextId
}
}
<li v-for="i in list" :key="i|allocId"></li>
这样就能自动识别对象,为之分配唯一的 ID。
不过更好的方案是拿到数据之后预处理一遍,给每项分配一个 ID。
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答5.1k 阅读✓ 已解决
3 回答1.9k 阅读✓ 已解决
这样应该可以了,变量名+索引,或者功能描述啥的+索引