数据更新但视图不刷新的解决方法

数据更新但视图不刷新的解决方法

JiangWen Lv4

前言: 在开发中我们处理数据时会遇到数据更新了,但视图并没有更新的情况。

一般有以下几种情况会导致该问题:

  1. 动态给对象新增属性或者删除属性
  2. 通过数组下标修改数组中的元素或者手动修改数组的长度

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<template>
<p v-if='show'>{{obj.a}} | {{obj.b}}<p>
<button @click="handleTest">change</button>
</template>

<script>
export default {
data() {
return {
show: true,
obj:{a:123}
};
},
methods: {
handleTest(){
this.obj.b = 456
}
}
}
</script>

解决方案

  1. 静默刷新(使用v-if的特性): 在修改值之后将元素销毁,然后在修改后的下一次DOM渲染完成时再显示出来,这样就会触发组件重新加载data的数据进行渲染,data中被修改的数据才是最新的。

    1
    2
    3
    4
    5
    6
    7
    handleTest(){
    this.obj.b = 456
    this.show = false
    this.$nextTick(()=>{
    this.show = true
    })
    }
  2. Vue.$set(官方推荐): 使用这个api修改的数据会为其添加响应式getter和setter让其拥有数据响应的特性

    1
    2
    3
    4
    // vm.set(要操作的对象或数组, 要新增或者修改的数组或对象key, 对应的值)
    handleTest(){
    this.$set(this.obj, 'b', 456)
    }
  3. Vue.$forceUpdate(手动强制更新视图): 因为Vue修改数据是异步执行的,所以视图不会立即更新,会等到下一次dom更新循环结束后统一更新发生在这一次循环中修改的数据,然后同步视图更新,所以我们可以修改后自己手动强制更新视图。

    1
    2
    3
    4
    handleTest(){
    this.obj.b =456
    this.$forceUpdate()
    }
  4. Object.assign(使用修改栈能触发视图更新的特性)

    1
    this.obj = Object.assign({}, {...this.obj, b: 456})
  5. 对于数组还可以使用splice方法: Vue对于数组的操作能识别变化的api包括push()、pop()、shift()、unshift()、splice()、sort()、reverse()这些都可被vue监测到

  • 标题: 数据更新但视图不刷新的解决方法
  • 作者: JiangWen
  • 创建于: 2020-02-28 12:15:00
  • 更新于: 2023-06-18 15:54:09
  • 链接: https://blog.jiangwen.site/2020/02/28/Vue/数据更新但视图不刷新的解决方法/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
 评论
此页目录
数据更新但视图不刷新的解决方法