Vue 反应性不会选择添加到数组元素的新 属性
Vue reactivity doesn't pick up new property added to element in a array
不确定我的解释是否正确,但我遇到了一个问题,我的模板元素之一没有对数组元素的添加 属性 作出反应。例如:
<div v-for="user in users"
v-bind:key="user.id"
v-bind:name="user.name">
{{user.name}}
<div class="warn" v-if="user.hasWarning">Warning!</div>
</div>
我试图在将 hasWarning: true
添加到 user
时显示警告
data:() {
users: [
{id: 1, name: "Foo"}
]
},
methods:{
showWarning: function(id) {
users.forEach(user => {
if (user.id == id) {
user.hasWarning = true;
}
});
}
}
我尝试调用 showWarning(id)
,我确实看到 hasWarning
从控制台和 Vue 开发人员工具添加到用户,但它没有呈现 <div class class="warn" v-if="user.hasWarning"..
。如果我将我的用户设置为 {id: 1, name: "foo", hasWarning: false}
,它似乎工作正常,但为什么它不适用于添加的 属性?我应该完全避免它吗?
您必须使用this.$set
方法来注册新属性。请参阅文档:https://vuejs.org/v2/api/#vm-set
尝试这样的事情:
<template>
<div>
<div v-for="user in users" v-bind:key="user.id" v-bind:name="user.name">
{{ user.name }}
<button @click="showWarning(user.id)">showWarning</button>
<div class="warn" v-if="user.hasWarning">Warning!</div>
</div>
</div>
</template>
<script>
export default {
name: 'App',
data: () => ({
users: [{ id: 1, name: 'Foo' }, { id: 2, name: 'Bar' }],
}),
methods: {
showWarning(id) {
let user = this.users.find(user => user.id == id);
this.$set(user, 'hasWarning', true);
},
},
};
</script>
不确定我的解释是否正确,但我遇到了一个问题,我的模板元素之一没有对数组元素的添加 属性 作出反应。例如:
<div v-for="user in users"
v-bind:key="user.id"
v-bind:name="user.name">
{{user.name}}
<div class="warn" v-if="user.hasWarning">Warning!</div>
</div>
我试图在将 hasWarning: true
添加到 user
data:() {
users: [
{id: 1, name: "Foo"}
]
},
methods:{
showWarning: function(id) {
users.forEach(user => {
if (user.id == id) {
user.hasWarning = true;
}
});
}
}
我尝试调用 showWarning(id)
,我确实看到 hasWarning
从控制台和 Vue 开发人员工具添加到用户,但它没有呈现 <div class class="warn" v-if="user.hasWarning"..
。如果我将我的用户设置为 {id: 1, name: "foo", hasWarning: false}
,它似乎工作正常,但为什么它不适用于添加的 属性?我应该完全避免它吗?
您必须使用this.$set
方法来注册新属性。请参阅文档:https://vuejs.org/v2/api/#vm-set
尝试这样的事情:
<template>
<div>
<div v-for="user in users" v-bind:key="user.id" v-bind:name="user.name">
{{ user.name }}
<button @click="showWarning(user.id)">showWarning</button>
<div class="warn" v-if="user.hasWarning">Warning!</div>
</div>
</div>
</template>
<script>
export default {
name: 'App',
data: () => ({
users: [{ id: 1, name: 'Foo' }, { id: 2, name: 'Bar' }],
}),
methods: {
showWarning(id) {
let user = this.users.find(user => user.id == id);
this.$set(user, 'hasWarning', true);
},
},
};
</script>