放肆青春的博客
首页
前端
算法
网络
面试
技术
后端
运维
杂项
数据库
工具
网址
电脑
个人
文章
  • 分类
  • 标签
  • 归档
github (opens new window)
gitee (opens new window)

放肆青春

一个前端菜鸟的技术成长之路
首页
前端
算法
网络
面试
技术
后端
运维
杂项
数据库
工具
网址
电脑
个人
文章
  • 分类
  • 标签
  • 归档
github (opens new window)
gitee (opens new window)
  • 前端

    • 前端 概览
    • 前端汇总

    • front 博文

    • front 项目总结

    • front 高级

    • front tools

  • vue

    • vue 概览
    • vue 汇总

    • vue 博文

    • vue 项目总结

    • vue 高级

      • vue 原理汇总
      • vue3新特性
      • watch原理
        • watch 源码分析
          • Watch 中的 deep:true 是如何实现的
        • watch 问题
          • watch 与 computed 的区别
          • computed、watch 执行顺序
      • computed原理
      • vue响应式原理
      • vue双向数据绑定
      • key原理
      • 虚拟DOM
      • diff算法
      • keep-alive原理
      • nextTick原理
      • scoped原理
      • vue模板编译
      • vue渲染机制
      • vue api原理
      • vue实例方法原理
      • vue源码
  • html

    • html 概览
    • html 汇总

    • html 博文

  • css

    • css 概览
    • css 汇总

    • css 博文

    • sass

    • less

  • js

    • javascript 概览
    • JS 汇总

    • ES6

    • JS 博文

    • JS 工具

  • node

    • node 概览
    • node 汇总

    • node 框架

    • node 博文

  • react

    • react 概览
    • react 汇总

    • react 博文

    • react 高级

  • 微信小程序

    • 微信小程序 概览
    • 微信小程序总结
    • 微信小程序文章
    • 微信小程序 博文

    • 微信小程序 高级

  • 微信公众号

    • 微信公众号 概览
    • 微信公众号总结
    • 微信公众号文章
  • 多端开发

    • 多端开发
    • dsbridge 概览
    • jsbridge 概览
    • webview
    • uniapp

      • uniapp 概览
    • taro

      • taro 概览
    • flutter

      • flutter 概览
      • flutter 环境搭建
    • electron

      • electron 概览
  • front
放肆青春
2021-06-07

watch原理

# watch 源码分析

  1. 判断 watch 写法(字符串,数组,函数)

调用 createWatcher ,从用户合起来传入的对象中把回调函数 cb 和参数 options 剥离出来,调用$watch 方法

# Watch 中的 deep:true 是如何实现的

当用户指定了 watch 中的 deep 属性为 true 时 监听器会一层层的往下遍历,给对象的所有属性都加上这个监听器 如果当前监控的值是数组类型。会对对象中的每一项进行求值,此时会将当前 watcher 存入到对应属性的依赖中,这样数组中对象发生变化时也会通知数据更新

# watch 问题

# watch 与 computed 的区别

  1. 缓存支持

watch 不支持缓存,数据变,直接会触发相应的操作;

computed 支持缓存,只有依赖数据发生改变,才会重新进行计算

  1. 异步支持

watch 支持异步;

computed 不支持异步,当 computed 内有异步操作时无效,无法监听数据的变化

  1. 使用场景

watch 当需要在数据变化时执行异步或开销较大的操作时,应该使用 watch,使用 watch 选项允许执行异步操作 ( 访问一个 API ),限制执行该操作的频率,并在得到最终结果前,设置中间状态。这些都是计算属性无法做到的。

computed 当需要进行数值计算,并且依赖于其它数据时,应该使用 computed,因为可以利用 computed 的缓存特性,避免每次获取值时都要重新计算。

# computed、watch 执行顺序

在 created 之前就会 就会进行初始化 computed 和 watch

image

看以下执行顺序图可以得出:

  1. 初始化时父元素 向 子元素传递数据分两个阶段,

(1) 一为父元素父 beforeMount 及之前的一个阶段,包括 data 中定义的赋值;

(2) 另一个阶段为,父元素 mounted 及其之后的阶段;在一个阶段中后面的赋值会替换前面的赋值;(如:父 created 覆盖父 data 中定义的),所以 watch 和 computed 会触发两次;

  1. watch 有 immediate 属性: 首次绑定的时候,是否执行 handler,默认 false

(1) 为 true 时,在子元素的 created 之前执行;

(2) 为 false 时 只有在父元素 mounted 之后值改变才会触发,否则是不会触发的;

  1. computed 执行值 computed 被引用处(数据变更时 watch 在 computed 之前执行),然后继续执行 computed 代码;computed 最早在 created 之后执行;

image


参考:父子组件生命周期、watch、computed 的执行顺序 (opens new window)

更新时间: 2/11/2022, 11:23:32 AM
vue3新特性
computed原理

← vue3新特性 computed原理→

最近更新
01
前端权限管理
02-24
02
vue2指令
02-24
03
vue2 hook
02-24
更多文章>
Theme by Vdoing | Copyright © 2019-2022 放肆青春
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式