iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > 其他 >vue3 reactive响应式依赖收集派发更新原理是什么
  • 432
分享到

vue3 reactive响应式依赖收集派发更新原理是什么

Vue3reactive 2023-05-16 19:05:56 432人浏览 安东尼
摘要

proxyvue3已经从Object.property更换成Proxy,Proxy相比于前者可以直接监听对象数组,对于深层次的对象和数组,会把触发对应getter,然后去递归进行依赖收集,并不是直接像Vue2暴力那样递归,总体而言性能更好对

    proxy

    vue3已经从Object.property更换成ProxyProxy相比于前者可以直接监听对象数组,对于深层次的对象和数组,会把触发对应getter,然后去递归进行依赖收集,并不是直接像Vue2暴力那样递归,总体而言性能更好

    • Reactive传进来的对象进行Proxy进行劫持在内部进行依赖收集与通知更新操作

    function reactive(raw) {
      return new Proxy(raw, {
        get(target, key) {
          const res = Reflect.get(target, key);
          //添加依赖
          track(target, key as string);
          return res;
        },
        set(target, key, value) {
          const res = Reflect.set(target, key, value);
          trigger(target, key);
          return res;
        },
      });
    }

    采用Reflet对对象进行标准化操作,因为如果直接采用js如果失败了,不会产生异常提示

    这样在进行获取数据是后进行依赖收集,在更新数据后进行通知依赖更新

    依赖收集

    接下来便介绍依赖收集是个什么样子

    const targetMap = new WeakMap();
    function track(target, key) {
      let depsMap = targetMap.get(target);
      if (!depsMap) {
        depsMap = new Map();
        targetMap.set(target, depsMap);
      }
      let dep = depsMap.get(key);
      if (!dep) {
        dep = new Set();
        depsMap.set(key, dep);
      }
      dep.add(currentEffect);
    }

    首先是一个WeakMap-->然后用户通过target获取对应的内部Map-->然后通过key获取到Set集合,内部便是存储的一个个依赖。其实依赖收集的过程就是这样。

    这里使用WeakMap原因是它是一个弱引用,不会影响垃圾回收机制回收。

    currentEffect

    那么currentEffect 到底是个什么东西呢?实际上是ReactiveEffect中正在运行的类

    class ReactiveEffect {
      private fn: Function;
      constructor(_fn: Function) {
        this.fn = _fn;
      }
      run() {
        currentEffect = this;
        this.fn();
      }
    }
    let currentEffect: null | ReactiveEffect = null;
    function effect(fn: Function) {
      const reactiveEffect = new ReactiveEffect(fn);
      reactiveEffect.run();
    }

    后续会详情讲解,目前可以就把他理解成一个依赖,用户使用了effect函数过后,里面的响应式数据发生变化后会重新执行传递进去的回调函数

    vue2中收集的依赖对应watcher,vue3收集的依赖实际是effect,他们两者实现功能实际上是一样的。

    派发更新

    这里暂不考虑DOM问题,操作起来其实很简单就是通过被Proxy劫持的targetkey找到对应的Set集合调用用户传递的fn函数进行依赖更新

    function trigger(target, key) {
      let depsMap = targetMap.get(target);
      let dep = depsMap.get(key);
      for (let effect of dep) {
        effect.fn();
      }
    }

    以上就是vue3 reactive响应式依赖收集派发更新原理是什么的详细内容,更多请关注编程网其它相关文章!

    --结束END--

    本文标题: vue3 reactive响应式依赖收集派发更新原理是什么

    本文链接: https://www.lsjlt.com/news/210461.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • vue3 reactive响应式依赖收集派发更新原理是什么
      proxyvue3已经从Object.property更换成Proxy,Proxy相比于前者可以直接监听对象数组,对于深层次的对象和数组,会把触发对应getter,然后去递归进行依赖收集,并不是直接像vue2暴力那样递归,总体而言性能更好对...
      99+
      2023-05-16
      Vue3 reactive
    • vue3 reactive响应式依赖收集派发更新原理解析
      目录proxy依赖收集currentEffect派发更新总结proxy vue3的响应式实现依旧是依赖收集与派发更新,本节乃至后面涉及的代码都是经过简化,文章目的是讲解原理,直接贴...
      99+
      2023-03-06
      vue3 reactive响应式 reactive依赖收集派发更新
    • Vue3 Reactive响应式原理是什么
      一、怎么实现变量变化怎么实现变量变化,相关依赖的结果也跟着变化 当原本price=5变为price=20后total应该变为40,但是实际total并不会改变。 解决办法可以这样,当变量改变了,重新计算一次,那么结果就会改变为最新的结果。如...
      99+
      2023-05-21
      Vue3 reactive
    • Vue 响应式系统依赖收集过程原理解析
      目录背景目标源码解读入口函数:observeclass ObserverObserve 如何处理数组Observe 如何处理对象class DepDep.targetclass Wa...
      99+
      2024-04-02
    • Vue中计算属性、监听属性、数据的响应式更新和依赖收集基本原理是什么
      这篇文章主要介绍“Vue中计算属性、监听属性、数据的响应式更新和依赖收集基本原理是什么”,在日常操作中,相信很多人在Vue中计算属性、监听属性、数据的响应式更新和依赖收集基本原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作...
      99+
      2023-07-05
    • Vue3的响应式原理是什么
      ProxyProxy这个核心API被Vue3的响应式原理所依赖,利用Proxy可以拦截一些对象操作。const obj = { a: 1 }; const p = new Proxy(obj, { get(target, propert...
      99+
      2023-05-24
      Vue3
    • Vue2/Vue3的响应式原理是什么
      本篇内容主要讲解“Vue2/Vue3的响应式原理是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue2/Vue3的响应式原理是什么”吧!在讲解之前,我们先了解一下数据响应式是什么?所谓数据...
      99+
      2023-07-05
    • vue3响应式原理和api编写的方法是什么
      这篇文章主要讲解了“vue3响应式原理和api编写的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue3响应式原理和api编写的方法是什么”吧!前言vue3响应式原理加api编写...
      99+
      2023-06-22
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作