Vue数据更新视图未更新的几种解决方案

 更新时间:2024年02月18日 08:56:15   作者:小蹦跶儿  
本文主要介绍在vue项目中,遇到数据更新但视图不更新的情况时,无法使用watch监听、无法使用this.$set方法,同时使用this.$forceUpdate()无效时,所使用的解决方案,需要的朋友可以参考下

一、问题描述

在Vue项目中,有时我们会遇到数据更新了,但是视图没有更新的情况,这是因为Vue使用的是异步更新的方式,如果数据变化时视图没有立即响应,则一般都会考虑使用以下几种解决方案:

  • 方案一:使用watch监听对象属性变化
<template>
    <div>
        <h3>{{userInfo.name}}</h3>
        <button @click="changeUserName">点击我改变用户名</button>
    </div>
</template>

<script>
export default {
    data(){
        return {
            userInfo: {
                name: '张三',
                age: 16
            }
        }
    },
    watch:{
        'userInfo.name': {
            handler(newValue, oldValue) {
              console.log('用户名变化了,新值:' + newValue + ',旧值:' + oldValue);
            },
            immediate: true,
            deep: true
        }
    },
    methods:{
        changeUserName(){
            // 假设异步请求修改用户名
            const newUserName = '李四';
            this.userInfo.name = newUserName;
        }
    }
}
</script>
  • 方案二:使用this.$set()强制更新响应式变量
// 定义数据对象:
obj: { name: "小明", age: 18, },       

// 基本语法:
this.$set(需要改变的对象,"需要改变的对象属性","新值")

示例如下:

<template>
    <div>
        <h3>{{initList.message}}</h3>
        <button @click="changeMessage">点击我改变message值</button>
    </div>
</template>

<script>
export default {
    data(){
        return {
            initList: {
                message: 'hello'
            },
        }
    },
    methods:{
        changeMessage(){
            // 假设是异步调用获取到了新的message值
            const newMessage='world';
            this.$set(this.initList, 'message', newMessage);
        }
    }
}
</script>
  • 方案三:使用this.$forceUpdate()强制性重新渲染
methods: {
    // 在某些情况下需要强制重新渲染组件
    forceRerender() {
        // 调用 $forceUpdate()方法
        this.$forceUpdate();
    }
}

但是,在项目中,如果以上方案均无效,比如由于无法使用watchthis.$set()实现所需功能,或者使用后会使代码变得更复杂、冗余;同时层级太多或其他原因导致this.$forceUpdate()也不起作用,那么还有什么方案可以解决视图不更新的问题呢?

二、解决方案

为确保视图更新,可以先将数据赋值后再清空,最后在this.$nextTick()中处理数据,并重新赋值。代码示例如下:

// 为确保视图更新,先将数据重新赋值给一个变量,然后再清空
const details = this.detailsList;
this.detailsList = [];

// 处理数据,并重新赋值
this.$nextTick(() => {
    // 处理数据
    const detailsList = this.formatList(details, data.playCourseChapterId);
    // 重新赋值
    this.detailsList = Object.assign([], detailsList);
})

这时,数据更新的同时,视图也会同步更新。

备注:
我这边的项目中,是因为层级循环太多,导致以上三种方案均不起作用。只有最后这种方案可以解决视图不更新的问题。

以上,希望对大家有帮助!

到此这篇关于Vue数据更新视图未更新的几种解决方案的文章就介绍到这了,更多相关Vue数据更新视图未更新内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue bus全局事件中心简单Demo详解

    vue bus全局事件中心简单Demo详解

    ue-bus 提供了一个全局事件中心,并将其注入每一个组件,你可以像使用内置事件流一样方便的使用全局事件。这篇文章给大家介绍了vue bus全局事件中心简单Demo,需要的朋友参考下吧
    2018-02-02
  • vue中实现在外部调用methods的方法(推荐)

    vue中实现在外部调用methods的方法(推荐)

    下面小编就为大家分享一篇vue中实现在外部调用methods的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-02-02
  • Vue2 响应式系统之深度响应

    Vue2 响应式系统之深度响应

    这篇文章主要介绍了Vue2 响应式系统之深度响应,文章基于Vue2 响应式系统的相关资料展开对Vue2 深度响应的介绍,需要的小伙伴可以参考一下
    2022-04-04
  • openlayers6之地图覆盖物overlay三种常用用法(popup弹窗marker标注text文本)

    openlayers6之地图覆盖物overlay三种常用用法(popup弹窗marker标注text文本)

    这篇文章主要介绍了openlayers6之地图覆盖物overlay三种常用用法(popup弹窗marker标注text文本),主要讲overlay三种最常用的案例,感兴趣的朋友一起看看吧
    2021-09-09
  • Vue移动端下拉加载更多数据onload实现方法浅析

    Vue移动端下拉加载更多数据onload实现方法浅析

    这篇文章主要介绍了Vue移动端下拉加载更多数据onload实现方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • vue项目中icon乱码的问题及解决

    vue项目中icon乱码的问题及解决

    这篇文章主要介绍了vue项目中icon乱码的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • 用electron 打包发布集成vue2.0项目的操作过程

    用electron 打包发布集成vue2.0项目的操作过程

    这篇文章主要介绍了用electron 打包发布集成vue2.0项目的操作步骤,把electron 加入到自己项目中各种不兼容,升级版本踩坑无数个,今天通过本文给大家分享下详细过程,需要的朋友可以参考下
    2022-10-10
  • el-table 树形数据 tree-props 多层级使用避坑

    el-table 树形数据 tree-props 多层级使用避坑

    本文主要介绍了el-table 树形数据 tree-props 多层级使用避坑,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-08-08
  • vue+django实现下载文件的示例

    vue+django实现下载文件的示例

    这篇文章主要介绍了vue+django实现下载文件的示例,帮助大家更好的理解和学习使用vue框架,感兴趣的朋友可以了解下
    2021-03-03
  • vue3动态路由刷新出现空白页的原因与最优解

    vue3动态路由刷新出现空白页的原因与最优解

    页面刷新白屏其实是因为vuex引起的,由于刷新页面vuex数据会丢失,这篇文章主要给大家介绍了关于vue3动态路由刷新出现空白页的原因与最优解的相关资料,需要的朋友可以参考下
    2023-11-11

最新评论