0

0

Vue.js响应式数据中Trigger触发器逻辑与副作用函数执行

冷炫風刃

冷炫風刃

发布时间:2026-03-18 09:31:21

|

969人浏览过

|

来源于php中文网

原创

Trigger 是依赖更新的关键环节,它不直接执行副作用函数,而是通知哪些依赖需要重新运行;其核心作用是根据操作类型和 key 查找依赖集合、加入待执行队列并防重复触发,实际执行由调度器或 effect 重新求值完成。

vue.js响应式数据中trigger触发器逻辑与副作用函数执行

Vue.js 的响应式系统中,Trigger 是依赖更新的关键环节,它不直接执行副作用函数,而是通知哪些依赖需要重新运行。真正执行副作用的是调度器(scheduler)或 effect 的重新求值过程。

Trigger 触发器的核心作用

当响应式数据被修改(如赋值、删除属性、数组索引变更等),Vue 会调用 trigger 函数。它的主要职责是:

  • 根据当前操作类型(setdeleteclear 等)和目标对象的 key,查找已收集的依赖集合(即 DepReactiveEffect[]
  • 将匹配的副作用函数(effect)加入待执行队列,而非立即调用
  • 确保同一 effect 在一次事件循环中只执行一次(防重复触发)

副作用函数如何被实际执行

Trigger 本身不调用 effect,它委托给调度逻辑:

  • 默认情况下,effect 被标记为“非懒执行(lazy: false)”,触发后由 queueJob 推入微任务队列(Promise.thenqueueMicrotask
  • 在下一个 tick,Vue 批量执行所有待处理的 effect,避免重复渲染或计算
  • 若手动传入 options.scheduler,则由你自定义的调度器决定何时、如何执行该 effect

例如:watch(source, callback, { scheduler: (job) => setTimeout(job, 0) }) 就会让副作用延迟到宏任务执行。

立即学习前端免费学习笔记(深入)”;

MidReal AI
MidReal AI

MidReal AI是一款革命性的AI小说生成工具,同时也是一个文本互动冒险游戏平台。

下载

常见触发场景与对应依赖收集逻辑

不同操作触发的依赖类型不同,影响哪些 effect 会被通知:

  • obj.foo = newValue → 触发 trigger(target, 'set', 'foo') → 通知读取过 obj.foo 的 effect
  • delete obj.bar → 触发 trigger(target, 'delete', 'bar') → 通知依赖 hasOwnPropertyin 操作或 obj.bar 的 effect
  • arr[1] = newVal(数组索引赋值)→ 触发 trigger(arr, 'set', 1)trigger(arr, 'set', 'length')(长度可能变化)
  • arr.push(x) → 同样触发 'set''length',还会触发 'add'(仅限 Map/Set)

调试与排查:为什么 effect 没有执行

多数“响应失效”问题出在依赖未正确建立或 trigger 未覆盖路径:

  • 响应式对象未通过 reactive/ref 创建,或解构后丢失响应性(如 const { count } = reactive({ count: 0 })
  • 副作用中访问了未被 track 的属性(如首次读取时条件为假,后续才读取,但依赖未收集)
  • 异步更新中修改了非响应式字段,或在 effect 外部直接修改了原始对象(绕过 proxy)
  • 使用 shallowRefmarkRaw 阻断了深层响应,但代码又试图响应其子属性

可借助 onTrack / onTrigger 选项观察依赖收集与触发过程,定位漏掉的路径。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
vue.js为什么报错
vue.js为什么报错

vue.js报错的原因:1、语法错误;2、组件使用不当;3、数据绑定问题;4、生命周期钩子使用不当;5、插件或依赖问题;6、路由配置错误;7、异步操作处理不当等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

129

2024.03.11

vue.js插槽有哪些用
vue.js插槽有哪些用

vue.js插槽的作用:1、提高组件的可重用性;2、实现组件的灵活布局;3、实现组件间的数据传递和交互;4、促进组件的解耦和模块化。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

187

2024.03.11

vue.js怎么带参数跳转
vue.js怎么带参数跳转

vue.js带参数跳转的方法:1、定义路由;2、在组件中使用路由参数;3、进行带参数的跳转。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

98

2024.03.11

counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

203

2023.11.20

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

565

2023.09.20

length函数用法
length函数用法

length函数用于返回指定字符串的字符数或字节数。可以用于计算字符串的长度,以便在查询和处理字符串数据时进行操作和判断。 需要注意的是length函数计算的是字符串的字符数,而不是字节数。对于多字节字符集,一个字符可能由多个字节组成。因此,length函数在计算字符串长度时会将多字节字符作为一个字符来计算。更多关于length函数的用法,大家可以阅读本专题下面的文章。

954

2023.09.19

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

77

2025.09.05

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

41

2025.11.16

抖漫入口地址合集
抖漫入口地址合集

本专题整合了抖漫入口地址相关合集,阅读专题下面的文章了解更多详细地址。

17

2026.03.17

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Vue 教程
Vue 教程

共42课时 | 9.7万人学习

Vue3.x 工具篇--十天技能课堂
Vue3.x 工具篇--十天技能课堂

共26课时 | 1.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号