Vue 中如何手动更新虚拟 DOM?

简介: Vue 中如何手动更新虚拟 DOM?

在 Vue 里,通常数据变化会自动触发虚拟 DOM 的更新,但在某些特殊情形下,你可能需要手动更新虚拟 DOM。下面为你介绍不同 Vue 版本中手动更新虚拟 DOM 的方法:

Vue 2.x

1. 使用 this.$forceUpdate()

this.$forceUpdate() 是 Vue 2 实例的一个方法,调用它会强制组件重新渲染,也就是手动触发虚拟 DOM 的更新。不过需要注意,这只是重新运行渲染函数并更新虚拟 DOM,最终更新到真实 DOM 还是依赖于虚拟 DOM 的 Diff 算法。

<template>
  <div>
    <p>{
  { message }}</p>
    <button @click="forceUpdateDOM">手动更新</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      message: '初始消息'
    };
  },
  methods: {
    forceUpdateDOM() {
      // 手动更新数据
      this.message = '手动更新后的消息';
      // 强制组件重新渲染
      this.$forceUpdate();
    }
  }
};
</script>

注意事项

  • this.$forceUpdate() 会忽略数据是否真的发生变化,直接强制重新渲染组件,所以频繁使用可能会影响性能。
  • 它不会影响子组件,只有当前调用该方法的组件会重新渲染。

Vue 3.x

1. 使用 markRawreactive 结合手动更新

在 Vue 3 中,响应式系统有了较大改变,主要使用 reactiveref 来创建响应式数据。若要手动更新虚拟 DOM,可以借助 markRaw 让对象不具备响应式特性,然后手动更新数据并重新赋值。

<template>
  <div>
    <p>{
  { state.message }}</p>
    <button @click="manualUpdate">手动更新</button>
  </div>
</template>

<script setup>
import { reactive, markRaw } from 'vue';

// 创建一个非响应式对象
const rawState = {
  message: '初始消息'
};

// 使用 markRaw 标记对象,使其不具备响应式特性
const state = reactive(markRaw(rawState));

const manualUpdate = () => {
  // 手动更新数据
  state.message = '手动更新后的消息';
};
</script>

2. 使用 triggerRef(针对 ref 创建的数据)

如果使用 ref 创建响应式数据,当手动修改 .value 后,可以使用 triggerRef 手动触发更新。

<template>
  <div>
    <p>{
  { count }}</p>
    <button @click="manualUpdateCount">手动更新计数</button>
  </div>
</template>

<script setup>
import { ref, triggerRef } from 'vue';

const count = ref(0);

const manualUpdateCount = () => {
  // 手动修改 ref 的值
  count.value++;
  // 手动触发更新
  triggerRef(count);
};
</script>

手动更新虚拟 DOM 通常是在常规响应式机制无法满足需求时使用,使用时要谨慎,因为不合理的手动更新可能会破坏响应式系统的正常工作,还可能影响性能。

相关文章
|
11月前
|
JavaScript
vue监听dom元素的宽高变化和自定义指令监听dom元素的宽高变化
vue监听dom元素的宽高变化和自定义指令监听dom元素的宽高变化
982 0
|
11月前
|
存储 JavaScript 前端开发
揭秘Vue 2中的$nextTick:等待DOM更新的神奇时刻!
揭秘Vue 2中的$nextTick:等待DOM更新的神奇时刻!
|
1月前
|
存储 JavaScript 算法
Vue 中的虚拟 DOM 是什么,以及它是如何工作的。
Vue 中的虚拟 DOM 是什么,以及它是如何工作的。
|
6月前
|
JavaScript
在Vue中获取DOM元素的实际宽高
【10月更文挑战第2天】
787 76
|
7月前
|
JavaScript 前端开发
react字符串转为dom标签,类似于Vue中的v-html
本文介绍了在React中将字符串转换为DOM标签的方法,类似于Vue中的`v-html`指令,通过使用`dangerouslySetInnerHTML`属性实现。
218 0
react字符串转为dom标签,类似于Vue中的v-html
|
8月前
|
移动开发 JavaScript 前端开发
【Vue面试题二十二】、什么是虚拟DOM?如何实现一个虚拟DOM?说说你的思路
这篇文章深入探讨了虚拟DOM的概念、必要性以及在Vue中的实现方式,解释了虚拟DOM如何作为真实DOM的轻量级抽象,通过优化DOM操作提高性能,并实现跨平台渲染的能力。
【Vue面试题二十二】、什么是虚拟DOM?如何实现一个虚拟DOM?说说你的思路
|
10月前
|
JavaScript 前端开发
Vue的`v-if`和`v-show`用于条件渲染,`v-if`按需编译/销毁DOM,适合不频繁切换且节省初始化资源
【6月更文挑战第25天】Vue的`v-if`和`v-show`用于条件渲染,`v-if`按需编译/销毁DOM,适合不频繁切换且节省初始化资源;`v-show`则始终编译,仅通过CSS切换显示,适合频繁切换,初始渲染成本高但切换性能好。选择取决于元素显示状态的变化频率和初始渲染需求。
113 2
|
9月前
|
移动开发 JavaScript 前端开发
VUE实现一个列表清单【props 父子组件通信、slot插槽的使用、全局自定义指令的封装、$nextTick解决异步DOM更新、巧用v-model简化父子组件之间的通信、触发事件的事件源event】
VUE实现一个列表清单【props 父子组件通信、slot插槽的使用、全局自定义指令的封装、$nextTick解决异步DOM更新、巧用v-model简化父子组件之间的通信、触发事件的事件源event】
75 0
|
11月前
|
JavaScript 开发者
Teleport传送:使用Vue的Teleport进行跨DOM结构渲染
【4月更文挑战第24天】Vue.js的`&lt;teleport&gt;`组件用于跨DOM结构渲染,解决组件视觉呈现跨越父组件DOM的问题。它允许子组件内容传送到DOM的任意位置,如示例中将模态框移到`modal-container`元素。通过`target`属性指定目标元素,结合`v-if`控制显示,实现灵活的UI布局和交互。在适当场景下使用`&lt;teleport&gt;`能优化复杂应用的结构。
109 3
|
11月前
|
JavaScript 前端开发
vue创建dom的方法有哪些
vue创建dom的方法有哪些
146 2