解答
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 | <template> <div> <ul> <li v- for = "value in obj" :key= "value" > {{value}} </li> </ul> <button @click= "addObjB" >添加obj.b</button> </div> </template> <script> export default { data () { return { obj: { a: 'obj.a' } } }, methods: { addObjB () { this .obj.b = 'obj.b' console.log( this .obj) } } } |
点击button会发现, obj.b 已经成功添加,但是视图并未刷新。
原因在于在Vue实例创建时, obj.b 并未声明,因此就没有被Vue转换为响应式的属性,自然就不会触发视图的更新,这时就需要使用Vue的全局api—— $set():
1 2 3 4 5 | addObjB () { // this.obj.b = 'obj.b' this .$set( this .obj, 'b' , 'obj.b' ) console.log( this .obj) } |
$set() 方法相当于手动的去把 obj.b 处理成一个响应式的属性,此时视图也会跟着改变了
太棒了,我也是从事开发工作近十年的程序员,现在主要带新手学Java
在Vue创建实例时,新增属性并未被声明,因此就没有被Vue转换成响应式的属性,自然就不会触发视图的更新。
解决方法:使用$set()方法手动把新增的属性处理成响应式属性。
$set() 方法相当于手动的去把 obj.b 处理成一个响应式的属性,此时视图也会跟着改变了