Vue中$forceUpdate()的使用方式

 更新时间:2022年04月02日 14:40:19   作者:爱吃的前端程序员  
这篇文章主要介绍了Vue中$forceUpdate()的使用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

$forceUpdate()的使用

在Vue官方文档中指出,$forceUpdate具有强制刷新的作用。

$forceUpdate()

那在vue框架中,如果data中有一个变量:age,修改他,页面会自动更新。

但如果data中的变量为数组或对象,我们直接去给某个对象或数组添加属性,页面是识别不到的

<template>
  <p>{{userInfo.name}}</p>
  <button @click="updateName">修改userInfo</button>
</template>
<script>
  data(){
    return{
      userInfo:{name:'小明'}
    }
  },
  methods:{
    updateName(){
      this.userInfo.name='小红'
    }
  }
</script>

在updateName函数中,我们尝试给userInfo对象修改值,发现页面其实并没有变化

有两种解决方法 

方法一

methods:{
  updateName(){
    this.userInfo.name='小红'//在此时,确实已经将userInfo对象修改完成
    console.log(this.userInfo.name);//输出结果: 小红
    this.$forceUpdate();//在这里,强制刷新之后,页面的结果变为'小红'
  }
}

方法二

methods:{
  updateName(){
    this.$set('userInfo',name,'小红');
  }
}

关于$forceUpdate的一些理解

在官方文档上仅仅有这一句话

迫使 Vue 实例重新渲染。注意它仅仅影响实例本身和插入插槽内容的子组件,而不是所有子组件。

我的理解是,所谓重新渲染,仅仅是指重新渲染DOM并与原有的DOM做code diff。对于有变更的,渲染到页面。结合官方解释,可以确认有两点不会发生:

  • 不会重新触发生命周期钩子函数,比如mounted
  • 不会渲染子组件的更新,即使子组件的props发生改变了。

既然如此,什么场景下会需要使用呢?

我们知道,在Vue中,响应数据发生改变后,会自动触发更新,但有一些条件,不会触发更新,比如数组的一些方法,或者添加data中并未提前定义的响应式数据。

举个例子:

假设有一个列表需要渲染,我们在data中初始化了这个列表,并在mounted函数中通过fill去填充这个数组。fill这个api是不会触发自动更新的。

<template>
  <div class="hello">
    <div>
      <span v-for="(item, index) in arr" :key="index">{{ item }}</span>
    </div>
    <hello-world ref="hello" :list="arr" />
  </div>
</template>
<script>
import HelloWorld from "@/components/HelloWorld.vue";
export default {
  name: "About",
  components: {
    HelloWorld,
  },
  data() {
    return {
      arr: Array(4),
    };
  },
  mounted() {
    this.arr.fill(0);
    setTimeout(() => {
      this.$forceUpdate();
    }, 3000);
    setTimeout(() => {
      this.$refs.hello.$forceUpdate();;
    }, 5000);
  },

在上面的示例中,页面会在3秒后才看到更新,子组件会在5秒后看到更新。这也就解释了forceUpdate的含义。

即强制更新因某些原因并未渲染到页面的,已经改变的,应该被渲染到页面的数据。

他所影响的仅仅是【触发render函数生成DOM -> 与原DOM 进行diff -> 更新视图】这个过程。 

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。 

相关文章

  • vue如何自定义地址设置@

    vue如何自定义地址设置@

    这篇文章主要介绍了vue如何自定义地址设置@,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • 在vue-cli中引入lodash.js并使用详解

    在vue-cli中引入lodash.js并使用详解

    今天小编就为大家分享一篇在vue-cli中引入lodash.js并使用详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • 一个vue组件库发布到npm的完整实现过程

    一个vue组件库发布到npm的完整实现过程

    工作的时候总是使用别人的npm包,然而我有时心底会好奇自己如何发布一个npm包呢,什么时候自己的包能够被很多人喜欢并使用呢,下面这篇文章主要给大家介绍了关于一个vue组件库发布到npm的相关资料,需要的朋友可以参考下
    2022-03-03
  • Vue打包后不同版本详细解析

    Vue打包后不同版本详细解析

    vue项目打包是我们日常经常遇到的,下面这篇文章主要给大家介绍了关于Vue打包后不同版本详细解析的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • 如何使用Vue3构建一个图像画廊(支持图片上传)

    如何使用Vue3构建一个图像画廊(支持图片上传)

    这篇文章主要给大家介绍了关于如何使用Vue3构建一个图像画廊(支持图片上传)的相关资料,Vue画廊这是vue编写的图库应用程序,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-09-09
  • vue2.0/3.0的响应式原理及区别浅析

    vue2.0/3.0的响应式原理及区别浅析

    这篇文章主要给大家介绍了关于vue2.0/3.0响应式原理及区别的相关资料,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • vue项目中vue-i18n和element-ui国际化开发实现过程

    vue项目中vue-i18n和element-ui国际化开发实现过程

    这篇文章主要介绍了vue项目中vue-i18n和element-ui国际化开发实现过程,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2018-04-04
  • vue中axios利用blob实现文件浏览器下载方式

    vue中axios利用blob实现文件浏览器下载方式

    这篇文章主要介绍了vue中axios利用blob实现文件浏览器下载方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • vue打包项目版本号自加的操作步骤

    vue打包项目版本号自加的操作步骤

    项目每次打包后都需要改动项目版本号,这个改动每次都需要在package.json中修改version,比较麻烦,到底有没有一种打包后版本号自加的办法,这篇文章主要介绍了vue打包项目版本号自加的步骤,需要的朋友可以参考下
    2022-09-09
  • vue如何给页面增加url前缀

    vue如何给页面增加url前缀

    这篇文章主要介绍了vue如何给页面增加url前缀问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12

最新评论