544 字
3 分钟

Vue 依赖收集与重新渲染机制

欢迎来到我的博客!#

使用 Markdown 格式编写。

今天学到了什么#

image-20260426185252494

问题:当点击按钮,触发changeCar这个函数的时候,vue模板中的数据不会重新更新

Vue 依赖收集与重新渲染机制#

核心问题分析#

重新渲染的触发条件 。

依赖收集的完整流程#

  1. 初始渲染 :

    • Vue 解析模板,找到 person 变量
    • 访问 person.name 属性,建立依赖关系
    • 渲染到页面
  2. 变量重新赋值 :

    • 执行 person = reactive({name: ‘新名字’})
    • 此时, person 变量指向了新的响应式对象
    • 但这个操作 不会触发 Vue 的响应式更新 ,因为1
      • 普通变量的重新赋值不是响应式操作
      • Vue 只监听响应式对象的属性变化
  3. 重新渲染的触发 :

    • 只有当 响应式数据发生变化 时,Vue 才会触发重新渲染
    • 例如:修改 person.name 、修改 ref 变量的值等
    • 如果没有这些触发条件,即使 person 变量已经指向新对象,Vue 也不会重新渲染
  4. 重新渲染时的依赖收集 :

    • 当其他响应式数据变化导致重新渲染时
    • Vue 会重新执行模板解析
    • 此时会从当前作用域中找到 person 变量(指向新对象)
    • 访问 person.name 属性,建立新的依赖关系
    • 渲染新的数据

测试案例#

<script setup>
import { ref, onMounted, reactive } from 'vue'
let person = reactive({
name: '张三',
age: 18,
place: '北京'
})
const relative = reactive({
father: '李四',
mother: '王五'
})
function changePerson() {
person = {
name: 'MIek',
age: 20,
place: '上海'
}
}
function changeFather() {
relative.father = 'Ross'
}
</script>
<template>
<div class="app">
<h1>{{ person.name }}</h1>
<p>年龄:{{ person.age }}</p>
<p>籍贯:{{ person.place }}</p>
<p>父亲:{{ relative.father }}</p>
<p>母亲:{{ relative.mother }}</p>
<button @click="changePerson">改变person</button>
<button @click="changeFather">改变父亲</button>
<p>改变后:{{ person.name }}</p>
<p>改变后:{{ person.age }}</p>
<p>改变后:{{ person.place }}</p>
</div>
</template>

先点击“改变person”这个按钮,再点击“改变父亲”这个按钮,就可以触发更新了

PixPin_2026-04-26_19-10-10

Footnotes#

  1. reactive() 只对 对象本身 的属性变化进行响应式处理,而不会对 变量本身的重新赋值 进行监听

赞助支持

如果这篇文章对你有帮助,欢迎赞助支持!

赞助
Vue 依赖收集与重新渲染机制
https://firefly.cuteleaf.cn/posts/study-everyday/2026-04-26今日学习-vue依赖收集与重新渲染机制/
作者
LJC
发布于
2026-04-26
许可协议
CC BY-NC-SA 4.0
最后更新于 2026-04-26,距今已过 128 天

部分内容可能已过时

目录