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

《Vue进阶教程》第二十九课:立即执行的回调

 往期内容:

《Vue进阶教程》第十八课:避免死循环

《Vue进阶教程》第十九课:computed初步实现

《Vue进阶教程》第二十课:lazy懒执行

《Vue进阶教程》第二十一课:支持缓存

《Vue进阶教程》第二十二课:自定义更新(调度器)

《Vue进阶教程》第二十三课:渲染计算属性的结果

《Vue进阶教程》第二十四课:优化

《Vue进阶教程》第二十五课:watch基本概念

《Vue进阶教程》第二十六课:实现侦听函数

《Vue进阶教程》第二十七课:实现侦听对象

《Vue进阶教程》第二十八课:实现新旧值

默认情况下, watch中的回调是不执行的. 但是可以通过传入参数让其立即执行

第一次立即执行回调时, 拿到的旧值是undefined

基本使用

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <script src="./vue.js"></script>
  </head>
  <body>
    <script>
      const { reactive, watch } = Vue

      const state = reactive({ name: 'xiaoming', address: { city: '武汉' } })

      watch(
        () => state.name,
        (newValue, oldValue) => {
          console.log('设置immediate选项会立即执行回调')
          console.log(newValue, oldValue)
        },
        { immediate: true }
      )

      setTimeout(() => {
        state.name = 'xiaopang'
      }, 1000)
    </script>
  </body>
</html>

具体实现

立即执行的函数和更新时执行的函数本质上是没有区别的

因此, 我们可以将scheduler封装起来

function watch(source, cb, options = {}) {
  let getter
  if (typeof source == 'function') {
    getter = source
  } else {
    getter = () => traverse(source)
  }
  let oldValue, newValue
  const job = () => {
    newValue = _effect.run()
    cb(newValue, oldValue)
    oldValue = newValue
  }
  const _effect = effect(getter, {
    lazy: true,
    scheduler: job,
  })

  if (options.immediate) {
    job()
  } else {
    oldValue = _effect.run()
  }
}


http://www.kler.cn/a/459281.html

相关文章:

  • WPS-JS宏快速上手
  • c-动态内存管理 (动态内存管理比较深入的分析和理解博客总结)
  • QT-窗口嵌入外部exe
  • 使用npm 插件[mmdc]将.mmd时序图转换为图片
  • Python爬虫 - 豆瓣图书数据爬取、处理与存储
  • 数据库进阶教程之DDL语句(万字详解)
  • OpenTK 光照与材质详解
  • 瓷砖缺陷检测数据集,使用yolo,coco json,pasical voc xml格式标注,可识别边缘崩裂,破洞,裂缝等缺陷,一共7992张原始图
  • 批量新建日报表只需10秒-Excel易用宝
  • HarmonyOS初步探索
  • [羊城杯 2024]miaoro
  • 嵌入科技的温情
  • 你有哪些Deep Learning(RNN、CNN)调参的经验?
  • Mysql(MGR)和ProxySQL搭建部署-Docker版本
  • 《云原生安全攻防》-- K8s安全配置:CIS安全基准与kube-bench工具
  • 【Go】Go数据类型详解—map
  • 2024.12.30(多点通信)
  • C语言-找出数组中两个数字的和为该数字的位置
  • 大数据面试笔试宝典之HBase面试
  • ECMAScript基础
  • Cypress测试框架详解:轻松实现端到端自动化测试
  • 项目总结-ElasticSearch性能优化考虑点
  • 飞搭系列 | 移动端列表批量选择:让数据处理更便捷
  • Mac、Linux命令
  • Facebook数据分析和报告不准确该如何解决?
  • 2025常见的软件测试面试题