学习笔记6(vue响应式实现和渲染函数)

1. vue 响应式实现

  • 学习链接:https://juejin.im/post/6844903981957791757
  • 核心概念
    • Watcher:初始化组件实例及更新组件
    • reactive:初始化数据模型data,劫持数据访问与修改
    • dep:收集渲染函数及收到通知执行渲染函数(观察者模式)

1.1 data 响应式

  • 使用
const data = reactive({
   
  msg: 'Hello World',
})

new Watcher(() => {
   
  document.getElementById('app').innerHTML = `msg is ${
     data.msg}`
})
  • reactive
    • 深度遍历 data,为每个属性添加 getter/setter
    • 访问属性时,订阅、返回值。设置属性时,修改值、通知。
import Dep from './dep'
import {
    isObject } from './utils'

// 将对象定义为响应式
export default function reactive<T extends object>(data: T): T{
   
  
  if (isObject(data)) {
   
    Object.keys(data).forEach(key => {
   
      defineReactive(data, key as keyof T)
    })
  }
  return data
}

function defineReactive<T extends object, K extends keyof T>(data: T, key: K): void {
   
  
  let val = data[key]
  const dep = new Dep()

  Object.defineProperty(data, key, {
   
    get() {
   
      dep.depend()
      return val
    },
    set(newVal) {
   
      val = newVal
      dep.notify()
    }
  })

  if (isObject(val)) {
   
    reactive(val)
  }
}
  • dep
    • 观察者模式的具体实现
    • 订阅时,数组新增 watcher。通知时,遍历数组并更新 watcher
    • targetStack
      • 栈(后进先出), 保存 watcher
      • 设置当前的 Dep.target
      • 嵌套组件watcher运行轨迹:父 -> 子 -> 孙 -> 子 -> 父
    • Dep.target
      • 全局变量
      • 正在渲染(getter)的 watcher
import Watcher from './watcher'

export default class Dep {
   
  static target: Watcher | null | undefined

  deps: Set<Watcher>

  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值