iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >如何解析Vue3的响应式原理
  • 364
分享到

如何解析Vue3的响应式原理

2023-06-22 01:06:27 364人浏览 安东尼
摘要

本篇文章给大家分享的是有关如何解析vue3的响应式原理,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Vue2响应式原理回顾// 1.对象响应化:遍历每个key,定义g

本篇文章给大家分享的是有关如何解析vue3的响应式原理,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

    Vue2响应式原理回顾

    // 1.对象响应化:遍历每个key,定义getter、setter// 2.数组响应化:覆盖数组原型方法,额外增加通知逻辑const originalProto = Array.prototypeconst arrayProto = Object.create(originalProto)  ;['push', 'pop', 'shift', 'unshift', 'splice', 'reverse', 'sort'].forEach(    method => {      arrayProto[method] = function () {        originalProto[method].apply(this, arguments)        notifyUpdate()      }    }  )function observe (obj) {  if (typeof obj !== 'object' || obj == null) {    return  }  // 增加数组类型判断,若是数组则覆盖其原型  if (Array.isArray(obj)) {    Object.setPrototypeOf(obj, arrayProto)  } else {    const keys = Object.keys(obj)    for (let i = 0; i < keys.length; i++) {      const key = keys[i]      defineReactive(obj, key, obj[key])    }  }}function defineReactive (obj, key, val) {  observe(val) // 解决嵌套对象问题  Object.defineProperty(obj, key, {    get () {      return val    },    set (newVal) {      if (newVal !== val) {        observe(newVal) // 新值是对象的情况        val = newVal        notifyUpdate()      }    }  })}function notifyUpdate () {  console.log('页面更新!')}

    vue2响应式弊端:
    响应化过程需要递归遍历,消耗较大
    新加或删除属性无法监听
    数组响应化需要额外实现
    Map、Set、Class等无法响应式
    修改语法有限制

    Vue3响应式原理剖析

    vue3使用es6的Proxy特性来解决这些问题。

    function reactive (obj) {  if (typeof obj !== 'object' && obj != null) {    return obj  }  // Proxy相当于在对象外层加拦截  // Http://es6.ruanyifeng.com/#docs/proxy  const observed = new Proxy(obj, {    get (target, key, receiver) {      // Reflect用于执行对象默认操作,更规范、更友好      // Proxy和Object的方法Reflect都有对应      // http://es6.ruanyifeng.com/#docs/reflect      const res = Reflect.get(target, key, receiver)      console.log(`获取${key}:${res}`)      return res    },    set (target, key, value, receiver) {      const res = Reflect.set(target, key, value, receiver)      console.log(`设置${key}:${value}`)      return res    },    deleteProperty (target, key) {      const res = Reflect.deleteProperty(target, key)      console.log(`删除${key}:${res}`)      return res    }  })  return observed}//代码测试const state = reactive({  foo: 'foo',  bar: { a: 1 }})// 1.获取state.foo // ok// 2.设置已存在属性state.foo = 'fooooooo' // ok// 3.设置不存在属性state.dong = 'dong' // ok// 4.删除属性delete state.dong // ok

    嵌套对象响应式

    测试:嵌套对象不能响应

    // 设置嵌套对象属性react.bar.a = 10 // no ok

    添加对象类型递归

      // 提取帮助方法      const isObject = val => val !== null && typeof val === 'object'      function reactive (obj) {        //判断是否对象        if (!isObject(obj)) {          return obj        }        const observed = new Proxy(obj, {          get (target, key, receiver) {            // ...            // 如果是对象需要递归            return isObject(res) ? reactive(res) : res          },          //...        }

    避免重复代理

    重复代理,比如

    reactive(data) // 已代理过的纯对象
    reactive(react) // 代理对象

    解决方式:将之前代理结果缓存,get时直接使用

    const toProxy = new WeakMap() // 形如obj:observed      const toRaw = new WeakMap() // 形如observed:obj      function reactive (obj) {        //...        // 查找缓存,避免重复代理        if (toProxy.has(obj)) {          return toProxy.get(obj)        }        if (toRaw.has(obj)) {          return obj        }        const observed = new Proxy(...)        // 缓存代理结果        toProxy.set(obj, observed)        toRaw.set(observed, obj)        return observed      }      // 测试效果      console.log(reactive(data) === state)      console.log(reactive(state) === state)

    以上就是如何解析Vue3的响应式原理,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网精选频道。

    --结束END--

    本文标题: 如何解析Vue3的响应式原理

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

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

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

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

    下载Word文档
    猜你喜欢
    • 如何解析Vue3的响应式原理
      本篇文章给大家分享的是有关如何解析Vue3的响应式原理,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Vue2响应式原理回顾// 1.对象响应化:遍历每个key,定义g...
      99+
      2023-06-22
    • 详解Vue3的响应式原理解析
      目录Vue2响应式原理回顾Vue3响应式原理剖析嵌套对象响应式避免重复代理总结 Vue2响应式原理回顾 // 1.对象响应化:遍历每个key,定义getter、setter //...
      99+
      2024-04-02
    • Vue3中的ref和reactive响应式原理解析
      目录1 ref2 isref判断是不是一个ref对象3 shallowref创建一个跟踪自身.value变化的 ref,但不会使其值也变成响应式的4 triggerRef5 cust...
      99+
      2022-11-13
      Vue3 ref和reactive响应式 Vue3 ref和reactive
    • Vue3响应式原理实例分析
      本篇内容介绍了“Vue3响应式原理实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!回顾 vue2.x 的响应式实现原理:对象类型:通过...
      99+
      2023-07-02
    • 深入理解Vue3响应式原理
      目录响应式原理手写实现1、实现Reactive2、实现依赖的收集和触发effect影响函数收集/添加依赖触发依赖3、移除/停止依赖衍生类型1、实现readonly2、实现shallo...
      99+
      2022-12-19
      vue3响应式原理精讲 vue3 响应式 vue 响应式原理
    • 详解vue3 响应式的实现原理
      目录核心设计思想Vue.js 2.x 响应式Vue.js 3.x 响应式依赖收集:get 函数派发通知:set 函数总结源码参考核心设计思想 除了组件化,Vue.js 另一个核心设计...
      99+
      2024-04-02
    • 一文详解Vue3响应式原理
      目录回顾 vue2.x 的响应式vue3的响应式回顾 vue2.x 的响应式 实现原理: 对象类型:通过object.defineProperty()对属性的读取、修改进行拦截(数据...
      99+
      2024-04-02
    • 一文详解Vue2/Vue3的响应式原理
      this.$delete(this.student, 'name');// 删除student对象属性name this.$set(this.student, 'age', '21');// ...
      99+
      2023-05-14
      Vue.js
    • Vue3 Reactive响应式原理逻辑详解
      目录前言一、怎么实现变量变化二、怎么实现变量变化三、将多个dep存储在Map中四、将多个object的depsMap继续存储起来五、核心六、源码解析(TypeScript)前言 本篇...
      99+
      2024-04-02
    • Vue3的响应式原理是什么
      ProxyProxy这个核心API被Vue3的响应式原理所依赖,利用Proxy可以拦截一些对象操作。const obj = { a: 1 }; const p = new Proxy(obj, { get(target, propert...
      99+
      2023-05-24
      Vue3
    • 关于Vue3中的响应式原理
      目录一、简介二、响应核心1.核心源码2.逐步分析上述示例代码3.收集依赖和触发依赖更新三、V3.2的响应式优化四、后话一、简介 本章内容主要通过具体的简单示例来分析Vue3是如何实现...
      99+
      2024-04-02
    • vue2和vue3数据响应式原理分析及如何实现
      今天就跟大家聊聊有关vue2和vue3数据响应式原理分析及如何实现,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。数据响应式视图跟数据是自动更新的,数据更新的时候视图是自动的更新的追踪...
      99+
      2023-06-22
    • Vue2/Vue3的响应式原理是什么
      本篇内容主要讲解“Vue2/Vue3的响应式原理是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue2/Vue3的响应式原理是什么”吧!在讲解之前,我们先了解一下数据响应式是什么?所谓数据...
      99+
      2023-07-05
    • Vue3 Reactive响应式原理是什么
      一、怎么实现变量变化怎么实现变量变化,相关依赖的结果也跟着变化 当原本price=5变为price=20后total应该变为40,但是实际total并不会改变。 解决办法可以这样,当变量改变了,重新计算一次,那么结果就会改变为最新的结果。如...
      99+
      2023-05-21
      Vue3 reactive
    • 一文带你深入理解Vue3响应式原理
      目录 响应式原理2.0的不足reactive和effect的实现effect track trigger测试代码递归实现reactive总结 响应式原理 Vue2...
      99+
      2022-11-13
      vue3响应式原理精讲 vue3 响应式 vue 响应式原理
    • vue3 reactive响应式依赖收集派发更新原理解析
      目录proxy依赖收集currentEffect派发更新总结proxy vue3的响应式实现依旧是依赖收集与派发更新,本节乃至后面涉及的代码都是经过简化,文章目的是讲解原理,直接贴...
      99+
      2023-03-06
      vue3 reactive响应式 reactive依赖收集派发更新
    • vue.js数据响应式原理解析
      目录Object.defineProperty()定义 defineReactive 函数递归侦测对象的全部属性流程分析observe 函数Observer 类完善 defineRe...
      99+
      2022-11-13
      vue.js数据响应式原理 vue.js数据响应式
    • 深度解析 Vue3 的响应式机制
      目录什么是响应式响应式原理定制响应式数据Vueuse 工具包什么是响应式 响应式一直都是 Vue 的特色功能之一;与之相比,JavaScript 里面的变量,是没...
      99+
      2024-04-02
    • vue3原始值响应丢失如何解决
      今天小编给大家分享一下vue3原始值响应丢失如何解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、ref 的引入ref ...
      99+
      2023-07-06
    • 一篇搞懂Vue2、Vue3响应式源码的原理
      目录前言Vue2响应式操作响应式函数的封装Depend类的封装监听对象的变化Vue3响应式操作Proxy、ReflectVue3响应式前言 我们在编写Vue2,Vue3代码的时候,经...
      99+
      2023-01-08
      Vue2响应式原理 Vue3响应式原理
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作