对象的数组属性存在
一般情况下,data()
返回的 JSON 中 user 的数组属性 roles 预先定义:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| <template> <div class="about"> <Button @click="changeRole1">修改角色一</Button> <Button @click="changeRole2">修改角色二</Button>
<div v-for="role in user.roles" :key="role.value"> {{ role.name }} - {{ role.value }} </div> </div> </template>
<script> export default { data() { return { user: { roles: [ { name: 'student', value: 1 }, { name: 'teacher', value: 2 }, ] } }; }, methods: { changeRole1() { this.user.roles = [{ name: 'president', value: 3 }]; }, changeRole2() { this.user.roles.push({ name: 'admin', value: 4 }); } } }; </script>
|
点击按钮修改数组内容后界面立即响应。
对象的数组属性不存在
当 user 的数组属性 roles 没有在 data()
中预先定义,v-for
也能正常执行,但不会执行 v-for
的 :key
绑定和循环中的内容,所以不会报错:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| <template> <div class="about"> <Button @click="changeRole1">修改角色一</Button> <Button @click="changeRole2">修改角色二</Button>
<div v-for="role in user.roles" :key="role.value"> {{ role.name }} - {{ role.value }} </div> </div> </template>
<script> export default { data() { return { user: {} }; }, methods: { changeRole1() { this.user.roles = [{ name: 'president', value: 3 }]; }, changeRole2() { this.$set(this.user, 'roles', [{ name: 'admin', value: 4 }]); } } }; </script>
|
情况比较复杂:
- 点击
修改角色一
,再点击修改角色二
,界面没有响应
- 点击
修改角色二
,roles 变成响应式属性,界面响应更新,再点击修改角色一
,界面响应更新
根数组属性不存在
如果假设数组直接是 this 的属性,但没有预先定义,则 v-for
直接报错:
Property or method “roles” is not defined on the instance but referenced during render.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <template> <div class="about"> <div v-for="role in roles" :key="role.value"> {{ role.name }} - {{ role.value }} </div> </div> </template>
<script> export default { data() { return {}; }, }; </script>
|