vue响应式数据更新,解决方案
问题: 刚学习vue的人可能会遇到这样一种情况,那就是当我们把属性在data中定义,接口异步请求到数据,并且把值赋值到我们在data中定义的值上,但是dom却没有更新,这时候我们可能就在想,为什么了?是不是vue有问题啊,妈的,vue有毛病吧。<div id="app"><h2>{{data.value}}</h2></div>data: {data
·
问题: 刚学习vue的人可能会遇到这样一种情况,那就是当我们把属性在data中定义,接口异步请求到数据,并且把值赋值到我们在data中定义的值上,但是dom却没有更新,这时候我们可能就在想,为什么了?是不是vue有问题啊。
<div id="app">
<h2>{{data.value}}</h2>
</div>
data: {
data: {}
},
created() {
this.$axios.get().then(res => {
this.data.value = res;
})
}
vue的响应式是不完美的,它仅仅只能观测到object数据的取值及设置值,当我们向object数据里添加一对新的key/value或删除一对已有的key/value时,它是无法观测到的,导致当我们对object数据添加或删除值时,无法通知依赖,无法驱动视图进行响应式更新。
解决方法
1、在请求接口得到数据后,把data值再度赋值为空。
<div id="app">
<h2>{{data.value}}</h2>
</div>
data: {
data: {}
},
created() {
this.$axios.get().then(res => {
this.data = {};
this.data.value = res;
})
}
原理:因为vue的dom更新是异步的,即当setter操作发生后,指令并不会立马更新,指令的更新操作会有一个延迟,当指令更新真正执行的时候,此时.value属性已经赋值,所以指令更新模板时得到的是新值。
2、Vue.$set
通过set方法可以将添加一个具备响应式特性的属性,并且其子属性也具备响应式特性,但是必须是新属性才可以,如果是本身已有的属性该方法是不起作用的。
<div id="app">
<h2>{{data.value}}</h2>
</div>
data: {
data: {}
},
created() {
this.$axios.get().then(res => {
this.$set('data.value', res);
})
}
更多推荐
已为社区贡献4条内容
所有评论(0)