iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Vue3使用Proxy实现数据监听的原因分析
  • 781
分享到

Vue3使用Proxy实现数据监听的原因分析

2024-04-02 19:04:59 781人浏览 薄情痞子
摘要

Vue 数据双向绑定原理,而这个方法有缺点,并且不能实现数组和对象的部分监听情况;具体也可以看我之前写的一篇博客: 关于 Vue 不能 watch 数组 和 对象变化的解决方案,最新

Vue 数据双向绑定原理,而这个方法有缺点,并且不能实现数组和对象的部分监听情况;具体也可以看我之前写的一篇博客: 关于 Vue 不能 watch 数组 和 对象变化的解决方案,最新的 Proxy,相比 vue2 的 Object.defineProperty,能达到速度加倍、内存减半的成效。具体是怎么实现、以及对比旧的实现方法为啥能有速度加倍、内存减半的特性,下面我们来聊聊:

Vue 初始化过程

Vue 的初始化过程,分别有Observer、Compiler和Watcher,当我们 new Vue 的时候,会调用Observer,通过 Object.defineProperty 遍历 vue 对象的 data、computed 或者 props(如果是组件的话)的所有属性进行监听。同时通过Compiler解析模板指令,解析到属性后就 new 一个Watcher并绑定更新函数到 watcher 当中,Observer 和 Compiler 就通过属性来进行关联。

Object.defineProperty

来个简单的 Object.defineProperty例子


class Observer {
    constructor(data) {
      // 遍历参数 data 的属性,给添加到 this 上
      for (let key of Object.keys(data)) {
        if (typeof data[key] === "object") {
          data[key] = new Observer(data[key]);
        }
        Object.defineProperty(this, key, {
          enumerable: true,
          configurable: true,
          get() {
            console.log("你访问了" + key);//你访问了age
            return data[key];//20
          },
          set(newVal) {
            console.log("你设置了" + key); //你设置了age
            console.log("新的" + key + "=" + newVal); //新的age=20
            if (newVal === data[key]) {
              return;
            }
            data[key] = newVal;
          }
        });
      }
    }
  }const obj = {
    name: "app",
    age: "18",
    a: {
      b: 1,
      c: 2,
    }
  };const app = new Observer(obj);app.age = 20;console.log(app.age);app.newPropKey = "新属性";console.log(app.newPropKey);    //新属性

从上面可以知道:Object.defineProperty 需要遍历所有的属性,这就造成了如果 vue 对象的data/computed/props 中的数据规模庞大,那么遍历起来就会慢很多.同理,如果 vue 对象的 data/computed/props 中的数据规模庞大,那么 Object.defineProperty 需要监听所有的属性的变化,那么占用内存就会很大。

Proxy

我们来看看proxy

Proxy 对象用于定义基本操作的自定义行为(如属性查找,赋值,枚举,函数调用等)

可以理解为在对象之前设置一个”拦截“,当监听的对象被访问的时候,都必须经过这层拦截。可以在这拦截中对原对象处理,返回需要的数据格式,也就是无论访问对象的什么属性,之前定义的或是新增的属性,都会走到拦截中进行处理。这就解决了之前所无法监听的问题。


const obj = {
  name: "krry",
  age: 24,
  others: {
    mobile: "mi10",
    watch: "mi4",
  },};const p = new Proxy(obj, {
  get(target, key, receiver) {
    console.log("查看的属性为:" + key);  
    return Reflect.get(target, key, receiver);
  },
  set(target, key, value, receiver) {
    console.log("设置的属性为:" + key); 
    console.log("新的属性:" + key, "值为:" + value); 
    Reflect.set(target, key, value, receiver);
  },});p.age = 22;console.log(p.age); p.single = "NO";console.log(p.single);p.others.shoe = "boost";console.log(p.others.shoe);输出结果为:设置的属性为:age
新的属性:age 值为:22查看的属性为:age22

设置的属性为:single
新的属性:single 值为:NO查看的属性为:singleNO 查看的属性为:others
查看的属性为:others
boost

由上可知,新增或编辑属性,并不需要重新添加响应式处理,都能监听的到,因为 Proxy 是对对象的操作,只要你访问对象,就会走到 Proxy 的逻辑中。Reflect 是一个内置的对象,它提供拦截 javascript 操作的方法。这些方法与proxy handlers的方法相同。Reflect不是一个函数对象,因此它是不可构造的,区别Proxy 和 Object.defineProperty 的使用方法看似很相似,其实 Proxy 是在更高维度上去拦截属性的。

Object.definePropertyVue2 中,对于给定的 data:如 { count: 1 },是需要根据具体的 key 也就是 count,去对 get 和 set 进行拦截,也就是:


Object.defineProperty(data, 'count', {
  get() {},
  set() {},})

必须预先知道要拦截的 key 是什么,这也就是为什么 Vue2 里对于对象上的新增属性无能为力,所以 Vue 初始化的过程中需要遍历 data 来挟持数据变化,造成速度变慢,内存变大的原因。

Proxy 而 vue3 所使用的 Proxy,则是这样拦截的:


new Proxy(data, {
  get(key) { },
  set(key, value) { },})

可以看到,proxy 不需要关心具体的 key,它去拦截的是修改 data 上的任意 key和读取 data 上的任意 key

所以,不管是已有的 key 还是新增的 key,都会监听到。

到此这篇关于Vue3使用Proxy实现数据监听的原因分析的文章就介绍到这了,更多相关Vue3为什么使用Proxy实现数据监听内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Vue3使用Proxy实现数据监听的原因分析

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

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

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

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

下载Word文档
猜你喜欢
  • Vue3使用Proxy实现数据监听的原因分析
    vue 数据双向绑定原理,而这个方法有缺点,并且不能实现数组和对象的部分监听情况;具体也可以看我之前写的一篇博客: 关于 Vue 不能 watch 数组 和 对象变化的解决方案,最新...
    99+
    2024-04-02
  • vue数据监听分析Object.defineProperty与Proxy的区别
    这篇文章主要介绍“vue数据监听分析Object.defineProperty与Proxy的区别”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vue数据监听分析Object.defineProper...
    99+
    2023-07-05
  • vue3中的Proxy一定要用Reflect的原因解析
    目录基本操作疑问总结怎么一直拿到符合期望的值,代理了像没有代理一样用过vue的知道,vue的响应实现用的Proxy,且里面是配合Reflect用的,查看Proxy和Reflect文档...
    99+
    2023-05-17
    vue3中Proxy使用Reflect Proxy使用Reflect
  • proxy实现vue3数据双向绑定原理
    目录一、proxy对比Object.defineProperty的优点二、、proxy监听对象的简单实现1.代理对象简单实现2.补充知识 Reflect3.proxy方法三、手写vu...
    99+
    2024-04-02
  • vue3怎么使用watch/watchEffect监听数据
    这篇文章主要介绍“vue3怎么使用watch/watchEffect监听数据”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vue3怎么使用watch/watchEffect监听数据”文章能帮助大家解...
    99+
    2023-07-06
  • Vue3源码分析侦听器watch的实现原理
    目录watch 的本质watch 的函数签名侦听多个源侦听单一源watch 的实现watch 函数source 参数cb 参数options 参数doWatch 函数doWatch ...
    99+
    2022-11-13
    Vue3侦听器watch Vue3侦听器watch原理
  • vue3如何使用watch监听props中的数据
    目录情况一:监听 props 中基本数据类型情况二:监听 props 中引用数据类型且父组件不改变地址指向情况三:监听 props 中引用数据类型且父组件改变地址指向总结写在最后情况...
    99+
    2022-11-13
    vue3监听props数据变化 vue3 监听props vue props监听
  • 使用JavaScript怎么实现数据监听
    使用JavaScript怎么实现数据监听?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。javascript是一种什么语言javascript是一种动态类型、弱类...
    99+
    2023-06-14
  • Oracle19c数据库监听异常的实例分析
    今天就跟大家聊聊有关Oracle19c数据库监听异常的实例分析,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。概述今天主要分享一个最近排查的监听问题,...
    99+
    2024-04-02
  • springBoot + mybatis-plus 实现监听 mysql的数据增删改的监听
    在Spring Boot + MyBatis-Plus中实现MySQL数据增删改的监听,可以通过以下步骤: 添加MyBatis-Plus依赖,在pom.xml文件中添加以下依赖:       com.baomidou    mybati...
    99+
    2023-09-13
    mybatis spring boot mysql
  • Pygame实现监听鼠标的示例分析
    Pygame实现监听鼠标的示例分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。初始化参数import pygame, sysfrom pyg...
    99+
    2023-06-22
  • 如何用JS实现简单的数据监听
    目录概述第一步第二步为什么需要单独的_data?给data多添加一点数据格式化初始值格式化object对象,监听值概述 主要是用Object.defineProperty实现类似vu...
    99+
    2024-04-02
  • Android系统 Settings数据库读写操作和数据监听变化原理分析
    在Android系统当中,系统设置保存着全局性、系统级别的用户编好设置,比如像飞行模式开关、是否开启手机静音模式时震动、屏幕休眠时长等状态值。这些用户偏好的设置很多就保存在SettingsProvider中,在Android 6.0及以后版...
    99+
    2023-09-02
    android
  • vue2和vue3数据响应式原理分析及如何实现
    今天就跟大家聊聊有关vue2和vue3数据响应式原理分析及如何实现,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。数据响应式视图跟数据是自动更新的,数据更新的时候视图是自动的更新的追踪...
    99+
    2023-06-22
  • 分析数据库实现原理
    本篇内容介绍了“分析数据库实现原理”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Hash连接,如内存足够,...
    99+
    2024-04-02
  • 分析数据库Seconds_Behind_Master延迟的原因
    本篇内容主要讲解“分析数据库Seconds_Behind_Master延迟的原因”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“分析数据库Seconds_Behi...
    99+
    2024-04-02
  • vue中watch和computed能监听到数据改变的原因是什么
    这篇文章主要为大家展示了“vue中watch和computed能监听到数据改变的原因是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“vue中watch和co...
    99+
    2024-04-02
  • Sharding-Proxy分库分表和数据加密使用场景分析
    目录Sharding-Proxy分库分表和数据加密使用场景配置文件讲解server.yamlconfig-sharding.yamlconfig-encrypt.yaml其他使用情况...
    99+
    2024-04-02
  • Vue数据监听器watch和watchEffect的使用
    目录watch()函数watchEffect()函数watch与watchEffect之间的联系与区别我们都知道监听器的作用是在每次响应式状态发生变化时触发,在组合式 API 中,我...
    99+
    2023-02-23
    Vue watch监听器 Vue watchEffect监听器 Vue 监听器
  • Python使用pytest-playwright的原因分析
    目录1 用playwright能不能不用这个包?2 安装3 代码和文档4 示例代码5 结论pytest-playwright 是一个 Python 包,它允许您使用 Microsof...
    99+
    2023-03-02
    python使用pytest-playwright 使用pytest playwright
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作