javascript - Vue,数据和计算的组件中的值不同吗?
问题描述
我在我的代码中发现组件数据中显示的值不是我想要的值。代码如下:
View.component('xxx-item',{
props:['item'],
template:`xxxx`,
computed:{
computedTest(){
return this.item.id
}
},
data:function(){
return{
test:this.item.id
}
}
}
xxx-item 用于列表中的项目,如下所示:
<xxx-list v-for="item in xxxList" v-bind:item="item"></xxx-list>
我认为this.test和this.computedTest的值,这意味着this.item.id应该相同。但它们实际上在某些时候是不同的。为什么?数据中的值和计算的值有什么区别?
项目数据设置如下:
function loading(){
axiox.get(xxx)
.then((res)=>{
let result = [];
for(let item of res.xxx.list){
let obj = {};
obj.id = item.id;
.............
.............
result.push(obj);
}
this.xxxList = result;
})
}
解决方案
Vue 将在重新渲染期间尽可能重用组件。这意味着如果您在 中添加、删除或重新排序项目xxxList
,那么某些<xxx-item>
组件将绑定到不同的项目。计算属性computedTest
将更新以反映此更改,但数据属性test
不会更改,因为它仅在组件实例化时设置一次。
您需要使用key
on<xxx-item>
来确保对数组中的相同项使用相同的组件实例。
例如
<xxx-item v-for="item in xxxList" :key="item.id" :item="item">
当 Vue 更新使用 渲染的元素列表时
v-for
,默认情况下它使用“就地补丁”策略。如果数据项的顺序发生了变化,而不是移动 DOM 元素以匹配项的顺序,Vue 将就地修补每个元素并确保它反映应该在该特定索引处呈现的内容。
推荐阅读
- pyspark - 如何在pyspark中聚合连续的行
- html - 使用锚标签创建的按钮上的悬停效果不正确
- c++ - MATLAB R2016b - MEX 无法编译 C++ 代码
- javascript - Facebook Instant Game - 我可以创建上下文更新侦听器吗?
- java - 部署 Spring .ear 时常量池标签无效
- java - 在空对象引用上接收 'android.content.Context android.content.Context.getApplicationContext()'
- c# - Visual Studio 2019 XAML 设计器不显示来自外部项目的 x64 用户控件
- javascript - 如何在应用程序的同一页面中获取所有活动用户
- node.js - 如何使异步函数在nodejs中作为同步运行
- c - 不可变的 julia 结构可以安全地进行变异吗?在什么条件下可以安全地进行变异?