固定值

let activeEffect;
class Dep {constructor(value) {this.subscribes = new Set()this._value = value}get value() {this.depend()return this._value}set value(newValue) {this._value = newValuethis.notify()}depend() {if (activeEffect) {this.subscribes.add(activeEffect)}}notify() {this.subscribes.forEach(effect => {effect()})}
}function watchEffect(effect) {activeEffect = effect effect()activeEffect = null
}const dep = new Dep('hello!')
watchEffect(() => {console.log(dep.value) // hello!
})
dep.value = 'change!' // change!

Object.defineProperty

let activeEffect;class Dep {subscribes = new Set()depend() {if (activeEffect) {this.subscribes.add(activeEffect)}}notify() {this.subscribes.forEach(effect => {effect()})}
}function watchEffect(effect) {activeEffect = effect effect()activeEffect = null
}function reactive(raw) {Object.keys(raw).forEach(key => {const dep = new Dep()let value = raw[key]Object.defineProperty(raw, key, {get() {dep.depend()return value},set(newValue) {value = newValuedep.notify()}})})return raw
}const state = reactive({count: 1
})watchEffect(() => {console.log(state.count)
})state.count++

Proxy

let activeEffect;class Dep {subscribes = new Set()depend() {if (activeEffect) {this.subscribes.add(activeEffect)}}notify() {this.subscribes.forEach(effect => {effect()})}
}function watchEffect(effect) {activeEffect = effecteffect()activeEffect = null
}const targetMap = new WeakMap()function getDep(target, key) {let depMap = targetMap.get(target)if (!depMap) {depMap = new Map()targetMap.set(target, depMap)}let dep = depMap.get(key)if (!dep) {dep = new Dep()depMap.set(key, dep)}return dep
}
const reactiveHandlers = {get(target, key, receiver) {const dep = getDep(target, key)dep.depend()return Reflect.get(target, key, receiver)},set(target, key, value, receiver) {const dep = getDep(target, key)let result = Reflect.set(target, key, value, receiver)dep.notify()return result}
}
function reactive(raw) {return new Proxy(raw, reactiveHandlers)
}const state = reactive({count: 1
})watchEffect(() => {console.log(state.count)
})state.count++

vue3.0响应式原理.reactive watchEffect相关推荐

  1. Vue3的响应式原理解析

    Vue3的响应式原理解析 Vue2响应式原理回顾 // 1.对象响应化:遍历每个key,定义getter.setter // 2.数组响应化:覆盖数组原型方法,额外增加通知逻辑 const origi ...

  2. vue3.0响应式源码实践,vue3.0初体验

    vue3.0响应式源码实践,vue3.0初体验 镇楼图--杀生丸.jpg vue-next(vue3.0预体验) 1. 使用: 2.vue-next的目录结构 3. reactive内部实现 作者上篇 ...

  3. arduinowifi.send怎么获取响应_Vue3.0 响应式原理 (一)

    前几天,回顾整理下关于vue2.0的响应式原理.温故而知新么,那么今天,整理了一下关于vue3.0的响应式原理,利用 JavaScript 来写的.本着尽可能的清晰易懂的原则,所以,可能会分几篇文章来 ...

  4. 手写Vue3.0响应式

    github源码地址 一. Reflect拦截器 Reflect(反射) 是一个内置的对象,它提供拦截 JavaScript 操作的方法.Reflect的所有属性和方法都是静态的(就像Math对象). ...

  5. 手写简单vue3响应式原理(reactive ref toRef toRefs)

    reactive ref toRef toRefs // 判断对象是否是对象 const isObject = val => val !== null && typeof val ...

  6. 实现vue2.0响应式原理

    很久之前为了面试,看了一些分析源码的博客,没有最近重新看一下vue的源码,匆匆浏览记住一些概念,因为懒惰,后面也没有再去深入探索:前段时间痛定思痛,觉得不能这样下去,过一下vue源码,此文章也是为了记 ...

  7. matlabeig函数根据什么原理_vue3.0 源码解析二 :响应式原理(下)

    一 回顾上文 上节我们讲了数据绑定proxy原理,vue3.0用到的基本的拦截器,以及reactive入口等等.调用reactive建立响应式,首先通过判断数据类型来确定使用的hander,然后创建p ...

  8. vue3.0 Beta发布,顺便来看看Vue3 的响应式和以前有什么区别

    前言 vue 3.0 Beta 测试版发布 可以通过vue-cli-plugin-vue-next创建一个vue3.0的beta项目. 目前尚不支持IE11,后期可能会处理兼容版本. 对vue3源码有 ...

  9. TS手写简陋版reactive响应式原理(依赖收集,依赖更新)

    最近博主看源码了解到了vue3的响应式原理 vue3的响应式实现是依赖收集与依赖更新,vue3已经从Object.property更换成Proxy,Proxy相比于前者可以直接监听对象数组,对于深层次 ...

最新文章

  1. Python数据可视化之南丁格尔玫瑰图(亲测)
  2. 矩阵的秩到底描述了什么?
  3. 设计高效sql一般经验谈
  4. codeforces Cable Connection
  5. sun.misc.Unsafe苦难告诉我们什么
  6. 深入浅出分布式存储的设计与优化之道
  7. 机器学习 —— 极大似然估计与条件概率
  8. 华为开发的新型智能手机的正面和背面采用玻璃材料制成
  9. DevExpress换肤功能使用方法
  10. 在android下使用i2c tools
  11. Axure元件-内联框架设计网页
  12. vivado和modelsim联合仿真,提示giving up waiting on lock,error:verilog compiler exiting解决方法
  13. python list切片_python list切片
  14. 管理之路:你的格局,决定你的结局
  15. 梯度消失和梯度爆炸情况详解
  16. 服务器并发C10K/C100k/C10M问题(重制版)
  17. 【问题】Ubuntu20.04桌面某些图标不显示
  18. 16进制与byte的转换
  19. 史上最简单的spark系列教程 | 完结
  20. Liunx7 DNS服务器正反解析,域名转发

热门文章

  1. 从磁带转成MP3--Audio Recorder
  2. php 获取 editcell,PHP编辑器之Komodo Edit的快捷键
  3. (完整版!!)十多年从事微波、系统、芯片的经验分享
  4. 利用nat123端口映射快速发布网站做网站服务,解决80端口映射被屏蔽被封问题,及nat123端口映射分析
  5. 电商如何运营好一个微社区?看MG小象、森马,如何打造买家社区
  6. Android增强现实(一)-AR的三种方式(展示篇)
  7. TrueType字体轮廓矢量绘制
  8. MIPS汇编语言开发环境MARS
  9. AAAI2022国际顶会Workshop将会讨论些什么?
  10. PHP - PECL - PHP扩展库 - 学习/实践