在 Vue 3 中,除了 `markRaw` 和 `reactive` 结合,还有其他方式手动更新虚拟 DOM 吗?

简介: 在 Vue 3 中,除了 `markRaw` 和 `reactive` 结合,还有其他方式手动更新虚拟 DOM 吗?

在 Vue 3 中,除了 markRawreactive 结合的方式,还有以下几种常见的手动更新虚拟 DOM 的方式:

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

ref 是 Vue 3 中创建响应式数据的一种方式,当手动修改 ref.value 属性后,默认情况下不会立即触发更新。可以使用 triggerRef 函数来手动触发更新。

<template>
  <div>
    <p>{
  { count }}</p>
    <button @click="incrementManually">手动增加计数</button>
  </div>
</template>

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

const count = ref(0);

const incrementManually = () => {
    // 手动修改 ref 的值
    count.value++;
    // 手动触发更新
    triggerRef(count);
};
</script>
AI 代码解读

2. 使用 nextTick

nextTick 用于在下次 DOM 更新循环结束之后执行延迟回调。虽然它本身不是直接手动更新虚拟 DOM,但可以结合数据修改来确保在数据更新后,DOM 已经更新完毕时执行某些操作,也可以变相实现手动控制更新流程的效果。

<template>
  <div>
    <p>{
  { message }}</p>
    <button @click="updateMessage">更新消息</button>
  </div>
</template>

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

const message = ref('初始消息');

const updateMessage = async () => {
    // 修改数据
    message.value = '新消息';
    // 等待 DOM 更新完成
    await nextTick();
    // 此时 DOM 已经更新,可以进行后续操作
    console.log('DOM 已更新');
};
</script>
AI 代码解读

3. 强制组件重新渲染

可以通过改变组件的 key 属性来强制组件重新渲染,从而达到手动更新虚拟 DOM 的目的。当 key 值发生变化时,Vue 会认为这是一个全新的组件实例,会重新创建并渲染该组件。

<template>
  <div>
    <MyComponent :key="componentKey" />
    <button @click="forceRerender">强制重新渲染</button>
  </div>
</template>

<script setup>
import { ref } from 'vue';
import MyComponent from './MyComponent.vue';

const componentKey = ref(1);

const forceRerender = () => {
    // 改变 key 值,强制组件重新渲染
    componentKey.value++;
};
</script>
AI 代码解读

4. 使用 shallowReftriggerRef

shallowRef 创建的是一个浅层响应式引用,只有 .value 属性本身是响应式的,而 .value 指向的对象内部的属性变化不会触发更新。可以结合 triggerRef 手动触发更新。

<template>
  <div>
    <p>{
  { person.name }}</p>
    <button @click="updateName">更新姓名</button>
  </div>
</template>

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

const person = shallowRef({ name: '张三' });

const updateName = () => {
    // 手动修改对象属性
    person.value.name = '李四';
    // 手动触发更新
    triggerRef(person);
};
</script>
AI 代码解读

这些方法在不同的场景下有各自的用途,开发者可以根据具体需求选择合适的方式来手动更新虚拟 DOM。

目录
打赏
510
57
57
0
60
分享
相关文章
vue3通过ref获取dom元素并修改样式
vue3通过ref获取dom元素并修改样式
959 0
vue3+echarts应用——深度遍历html的dom结构并用树图进行可视化
vue3+echarts应用——深度遍历html的dom结构并用树图进行可视化
282 1
Vue 3 中如何通过状态管理库来更新虚拟 DOM?
Vue 3 中如何通过状态管理库来更新虚拟 DOM?
163 57
|
11月前
|
Vue3基础(十wu)___ref获取原生dom元素
本文介绍了Vue3中使用`ref`来获取和操作原生DOM元素的方法,通过示例展示了如何通过`.value`改变元素的样式。
170 0
Vue3基础(十wu)___ref获取原生dom元素
Vue3组合式函数(监听DOM尺寸 useResizeObserver)
本文介绍如何使用 `ResizeObserver` API 编写 Vue3 的通用组合式函数 `useResizeObserver`,该函数可方便地观察一个或多个元素的尺寸变化,并执行指定回调。`ResizeObserver` 接口用于监控 `Element` 或 `SVGElement` 的尺寸变化,避免了无限回调循环问题。
791 0
Vue3组合式函数(监听DOM尺寸 useResizeObserver)
【三十天精通Vue 3】第十六天 Vue 3 的虚拟 DOM 原理详解
【三十天精通Vue 3】第十六天 Vue 3 的虚拟 DOM 原理详解
336 0
解决在VUE3项目中无法更改dom元素的样式问题
解决在VUE3项目中无法更改dom元素的样式问题
520 0
Vue3中虚拟dom原理介绍
虚拟DOM 本章将从零介绍Vue中的虚拟DOM,从渲染函数带到mount函数以及最后的patch函数也都有具体的代码实现。 致谢Vue Mastery非常好的课程,可以转载,但请声明源链接:文章源链接justin3go.com(有些latex公式某些平台不能渲染可查看这个网站)
163 0
【深入浅出】Vue3 虚拟 DOM
此篇我们将深入 Vue3 虚拟 DOM,以及了解它是如何遍历找到对应 vnode 的。
登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问