Vue3响应式原理实现

Vue3响应式原理实现

1、响应式的概念

比如对象的属性有一个初始化的值,有一段代码使用了这个值、那么在对象中的属性发生变化时,这段代码可以自动重新执行

2、响应式函数实现

把与对象属性相关函数 (下面称为对象的依赖) 放到一个数组中

如果属性发生变化会重新执行属性的依赖函数

let reactiveFns = []
function watchFn(fn) {
   
  reactiveFns.push(fn)
}

let obj = {
   
  name: 'lmw',
}
watchFn(function () {
   
  console.log('----------', obj.name)
})

// 如果修改了obj.name中的值 那么 会把与obj.name有关的函数再执行一遍
// 例如
obj.name = 'wml'
reactiveFns.forEach((fn) => {
   
  fn()
})
3、对依赖收集进行封装

上面写的代码只能收集name一个属性,但是在开发中所有对象不可能都只有一个属性,每一个属性就多写一个数组来收集这显然是不现实的,所以这里我们可以封装一个类来收集

class Depend {
   
  constructor() {
   
    // 用于存放依赖
    this.reactiveFns = []
  }
  addDepend(fn) {
   
    // 添加依赖的方法
    this.reactiveFns.push(fn)
  }
  notify() {
   
    // 执行依赖的方法
    this.reactiveFns.forEach((fn) => {
   
      fn()
    })
  }
}

// let reactiveFns = []

const depend = new Depend()

function watchFn(fn) {
   
  depend.addDepend(fn)
}

let obj = {
   
  name: 'lmw',
}
watchFn(function () {
   
  console.log('----------', obj.name)
})
obj.name = 'wml'
depend.notify()
// reactiveFns.forEach((fn) => {
   
//   fn()
// })
4、自动监听对象属性的变化

每次操作完对象属性的值时都要手动再执行一遍收集的依赖,这样很麻烦,所以我们可以用Proxy来监听这个对象

class Depend {
   
  constructor() {
   
    // 用于存放依赖
    this.reactiveFns = []
  }
  addDepend(fn) {
   
    // 添加依赖的方法
    this.reactiveFns.push(fn)
  }
  notify
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值