问题: 刚学习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);
	})
}
Logo

前往低代码交流专区

更多推荐