Vue中$forceUpdate()的使用方式

作者:爱吃的前端程序员 时间:2024-06-05 09:15:53 

$forceUpdate()的使用

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

Vue中$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 -> 更新视图】这个过程。 

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

来源:https://blog.csdn.net/y521123y/article/details/106257818

标签:Vue,$forceUpdate
0
投稿

猜你喜欢

  • linux下mysql开启远程访问权限 防火墙开放3306端口

    2024-01-24 10:59:14
  • 用javascript实现简单计算器

    2024-04-23 09:26:33
  • 详解使用python3.7配置开发钉钉群自定义机器人(2020年新版攻略)

    2022-05-10 01:18:53
  • 交互设计师心得——核心竞争力

    2010-01-19 13:45:00
  • Oracle PL/SQL入门案例实践

    2010-07-18 13:13:00
  • 对python中的pop函数和append函数详解

    2021-10-09 09:11:32
  • 这十大Python库你真应该知道

    2022-09-20 00:09:03
  • MySQL Binlog 日志处理工具对比分析

    2024-01-28 00:20:08
  • 一篇文章带你了解python中的typing模块和类型注解

    2023-08-05 21:37:02
  • Python实现统计给定字符串中重复模式最高子串功能示例

    2023-07-22 23:42:44
  • 用户是如何浏览你的网站的

    2010-05-03 14:26:00
  • django 消息框架 message使用详解

    2021-06-21 17:22:29
  • MySQL中使用去重distinct方法的示例详解

    2024-01-28 04:37:10
  • Microsoft Office Access 2007使用技巧

    2008-05-23 13:23:00
  • Mysql 存储过程中使用游标循环读取临时表

    2024-01-28 00:55:20
  • 分享8点超级有用的Python编程建议(推荐)

    2022-03-31 08:05:57
  • 关于大型页游后端管理系统的一点经验和个人见解

    2023-05-02 06:21:16
  • JavaScrpt的面向对象全面解析

    2024-04-23 09:20:40
  • Python基于React-Dropzone实现上传组件的示例代码

    2021-04-01 19:53:03
  • Python使用Pillow添加水印

    2021-01-28 08:30:50
  • asp之家 网络编程 m.aspxhome.com