当前位置: 首页 > ops >正文

Vue.js---立即执行的watch与回调执行时机

4.8 立即执行的watch与回调执行时机

1、立即执行的watch

watch 的两个特性:一个是立即执行的回调函数,另一个是回调函数的执行时机。

立即执行的回调函数:

// 回调函数只有在响应式数据 obj 后续发生变化时才执行 watch(obj, () => { console.log('变化了') // 回调函数会在 watch 创建时立即执行一次 immediate: true })

现在我们就要来完成这个功能:当 immediate 选项存在并且为 true 时,回调函数会在该watch 创建时立刻执行一次。所以我们可以把 scheduler 调度函数封装为一个通用函数,分别在初始化和变更时执行它。

    // watch函数:传入参数source以及回调函数function watch(source , cb) {// 定义job,就是把scheduler的内容进行提取const job = () => {// 值发生改变会发生,此时就有新值了newVal = effectFn()// 回调函数,传入新旧值cb(oldVal , newVal)// 一定要记得更新旧值oldVal = newVal}// 定义getterlet getter if(typeof source === 'function'){getter = source}else {getter = () => traverse(source)}// 定义新旧值let newVal , oldValconst effectFn = effect(() => getter(),{lazy: true,scheduler:job //改变的时候执行job})// 判断是否有immediate,有immediate就在最开始就要执行jobif(options.immediate){// 执行jobjob();}else {oldVal = effectFn();}// 调用effectFn就是旧值oldVal = effectFn();}

2、回调执行的时机

watch中flush 本质上是在指定调度函数的执行时机。当 flush 的值为 ‘post’ 时,代表调度函数需要将副作用函数放到一个微任务队列中,并等待 DOM 更新结束后再执行

   // watch函数:传入参数source以及回调函数function watch(source , cb) {// 定义job,就是把scheduler的内容进行提取const job = () => {// 值发生改变会发生,此时就有新值了newVal = effectFn()// 回调函数,传入新旧值cb(oldVal , newVal)// 一定要记得更新旧值oldVal = newVal}// 定义getterlet getter if(typeof source === 'function'){getter = source}else {getter = () => traverse(source)}// 定义新旧值let newVal , oldValconst effectFn = effect(() => getter(),{lazy: true,scheduler:() => {if(options.flush === 'post'){const p = Promise.resolve();p.then(job);}else {job()}}})// 判断是否有immediateif(options.immediate){// 执行jobjob();}else {oldVal = effectFn();}// 调用effectFn就是旧值oldVal = effectFn();}

在调度器函数内检测 options.flush 的值是否为 post,如果是,则将 job 函数放到微任务队列中,从而实现异步延迟执行;否则直接执行 job 函数,这本质上相当于 ‘sync’ 的实现机制,即同步执行。
之后很长一段时间我就不会看vue.js这本书啦,我的学长说现在市面上很多公司都改为react啦,react更加灵活,我之后会分享更多react的知识。

http://www.xdnf.cn/news/7321.html

相关文章:

  • 【PhysUnits】4.4 零类型(Z0)及其算术运算(zero.rs)
  • 支持python的单片机有哪些
  • 高防CDN:让攻击流量“一键清零“的智能防御之道
  • 动态页面采集技术
  • Spring Boot入门案例(Spring Initializr方式,IDEA版)
  • 新时代的可观测性:拥抱 GuanceDB 3.0
  • 前端的面试笔记——HTMLJavaScript篇(二)前端页面性能检测
  • 2025B卷 - 华为OD机试七日集训第2期 - 按算法分类,由易到难,循序渐进,玩转OD(Python/JS/C/C++)
  • 192环境记录 zlm2
  • 大小端模式和消息的加密解密
  • IPV4详解和ensp基础命令
  • C#学习9——接口、抽象类
  • Web3:Ubuntu系统 使用Docker-compose方式部署blockscout浏览器配置版本-v5.2.3-beta+charts图表
  • 2025ICPC邀请赛南昌游记
  • 架构演变 -单体到云原生
  • C++学习:六个月从基础到就业——C++20:范围(Ranges)进阶
  • 高速光耦在通信行业的应用(六) | 5Mbps通信光耦的应用
  • 5月19日day30打卡
  • JavaWeb:SpringBoot处理全局异常(RestControllerAdvice)
  • 5.19本日总结
  • Windows逆向工程提升之PE文件的基本概念
  • leetcode hot100:解题思路大全
  • 对话即编程:如何用 Trae 的 @智能体 5 分钟修复一个复杂 Bug?
  • JESD204 ip核使用与例程分析(二)
  • ebpf-verifier
  • Visual Studio构建三剑客:生成/重新生成/清理解决方案的正确打开方式
  • 双条件拆分工作表,一键生成独立工作簿-Excel易用宝
  • 【操作系统面经】持续更新ing
  • 每日一道leetcode(增加版)
  • 力扣网-复写零