• 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课程

  • 相关阅读:
    学会这几个软件,轻松实现图片翻译文字
    KEIL5 .33 调试M33单片机经常崩溃
    pat 最大公约数
    ch552g下载时遇到的可能问题
    iMazing2023iOS系统设备数据传输与备份工具使用教程
    Shiro认证及加盐加密
    c++征途 --- 项目 --- 职工管理系统
    数据库实验报告(一)
    Python用于解析 XML 数据之untangle使用详解
    纯Python实现遗传算法
  • 原文地址:https://blog.csdn.net/huangpb123/article/details/125531315