• Vue3 响应式原理


    先看个示例:

    1. const {effect, reactive} = require('@vue/reactivity')
    2. let dummy
    3. const counter = reactive({ num1: 1, num2: 2 })
    4. effect(() => {
    5. dummy = counter.num1 + counter.num2
    6. console.log(dummy)// 每次counter.num1修改都会打印日志
    7. })
    8. setInterval(()=>{
    9. counter.num1++
    10. },1000)

    上面代码的响应式整体流程:

    我们先使用 reactive 把普通的 JavaScript 对象包裹成响应式数据,然后在 effect 中获取 counter.num1counter.num2 的时候,就会触发 counter 的 get 拦截函数;get 函数,会把当前的 effect 函数注册到一个全局的依赖地图中去。这样 counter.num1 在修改的时候,就会触发 set 拦截函数,去依赖地图中找到注册的 effect 函数,然后执行。

    具体是怎么实现的呢?我们从第一步把数据包裹成响应式对象开始。先看 reactive 的实现。

    Vue3 中,reactive 是通过 ES6 中的 Proxy 特性实现的属性拦截,所以,在 reactive 函数中我们直接返回 newProxy 即可:

    1. export function reactive(target) {
    2. if (typeof target!=='object') {
    3. console.warn(`reactive ${target} 必须是一个对象`);
    4. return target
    5. }
    6. return new Proxy(target, mutableHandlers);
    7. }

    mutableHandles

    这里我们只拦截 get 和 set 操作。

    • get 中直接返回读取的数据,并且返回值是对象的话,还会嵌套执行 reactive,并且调用 track 函数收集依赖。
    • set 中调用 trigger 函数,执行 track 收集的依赖
    1. const get = createGetter();
    2. const set = createSetter();
    3. function createGetter(shallow = false) {
    4. return function get(target, key, receiver) {
    5. const res = Reflect.get(target, key, receiver)
    6. track(target, "get", key)
    7. if (isObject(res)) {
    8. // 值也是对象的话,需要嵌套调用reactive
    9. // res就是target[key]
    10. // 浅层代理,不需要嵌套
    11. return shallow ? res : reactive(res)
    12. }
    13. return res
    14. }
    15. }
    16. function createSetter() {
    17. return function set(target, key, value, receiver) {
    18. const result = Reflect.set(target, key, value, receiver)
    19. // 在触发 set 的时候进行触发依赖
    20. trigger(target, "set", key)
    21. return result
    22. }
    23. }
    24. export const mutableHandles = {
    25. get,
    26. set,
    27. };

    转载:极客时间-Vue3课程

  • 相关阅读:
    应用程序服务器/事件驱动编程/CommonJS介绍
    android 关闭屏幕
    语音领域,对于入门学生和初入职场者需要具备什么能力?
    Redis 3.2.3 crashed by signal: 11 服务宕机问题排查
    T1071 菲波那契数(信息学一本通C++)
    宝宝的这几个小秘密,你知道哪几个?
    汽车电子AEC Q101车规认证FDD9507L-F085 P沟道MOS管
    WorkPlus局域网即时通信软件,打造高效协作的智能选择
    VMware Centos7下载安装教程(超详细)
    第四代智能井盖传感器:智能井盖位移怎么进行监测
  • 原文地址:https://blog.csdn.net/huangpb123/article/details/125531315