如果后续的程序中再把这个值插入到data里,v-if
就没用了
我感觉是v-if
只对data中事先存在的值动态响应
有什么办法能解决这个问题么?
还是每次都得把data中的schema都写好?
<!--绑定了一个点击事件,在点击时给data动态插入本来不存在的属性-->
<div id="demo" @click="changeTest">
this is a test for v-if
<div v-if="testIf">
hello,vue
</div>
<span v-for="object in testArray" v-if="object.isTest" >
{{ object.content }}
</span>
</div>
new Vue({
el: '#demo',
data:{
testArray: [
{ content: 'xxx' },
{ content: 'yyy' },
{ content: 'zzzz' }
]
},
methods: {
changeTest: function() {
//这句生效了
this.$set('testIf', true);
//这句没有效果,想使数组的第一个元素出现
this.testArray.$set(0, {isTest: true});
}
}
});
我试了下,用$set改data下的直接属性是会让页面动态呈现的,v-if也生效了
然而数组不可,请问数组要怎么使其中没有的元素添加时在v-if上也动态呈现?
感谢@林岑影的回答和其他小伙伴的回答,以下是总结的解决方案
其实这就是个如何插入不存在的值让视图发生更新变化的问题
对于data的直接元素,直接用$set
方法就行了
对于插入数组item中不存在的属性,就是把数组的那个item取出来,插入原来不存在的那个属性,然后再把那个item放回数组里。
这里有两个方法可以触发视图更新
splice()
$set()
this.testArray.$set(index, item);
this.testArray.splice(index, 1, item);
而
this.testArray[index].someAttr = 'xxx';
或是
this.testArray[index].$set('newAttr', 'xxx');
经测试并不会发生视图更新
另外一种方法就是把所有用到的data对象属性(包括数组里的属性)都事先写好占位,这样就不会发生插入不存在的值的情况
当然可以..认真去看文档