iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > VUE >Proxy如何优化vue的数据监听机制问题
  • 843
分享到

Proxy如何优化vue的数据监听机制问题

2024-04-02 19:04:59 843人浏览 八月长安
摘要

这篇文章主要介绍Proxy如何优化Vue的数据监听机制问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!vue2.x中的实现其本质是new Watcher(data, key, ca

这篇文章主要介绍Proxy如何优化Vue的数据监听机制问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

vue2.x中的实现

其本质是new Watcher(data, key, callback)的方式,而在调用之前是先将data中的所有属性转化成可监听的对象, 其主要就是利用Object.defineProperty,。

class Watcher{
  constructor(data, key, cb){
  }
}
//转换成可监听对象
function observe(data){
  new Observer(data)
}
//修改数据的getter和setter
function defineReactive(obj, key){
  let value = obj[key];
  Object.defineProperty(obj, key, {
    enumerable: true,
    configurable: true,
    get(){
      return value;
    },
    set(newVal){
      value = newVal
    }
  })
}

Observer的实现很简单

class Observer {
  constructor(data){
    this.walk(data);
  }

  walk(data){
    for(var key in data) {
      // 这里不考虑嵌套的问题,否则的话需要递归调用walk
      defineReactive(data, key)
    }
  }
}

现在怎么将watcher和getter/setter联系起来,vue的方法是添加一个依赖类:Dep

class Watcher{
  constructor(data, key, cb){
    this.cb = cb;
    Dep.target = this; //每次新建watcher的时候讲给target赋值,对target的管理这里简化了vue的实现
    data[key];//调用getter,执行addSub, 将target传入对应的dep; vue的实现本质就是如此
  }
}
class Dep {
  constructor(){
    this.subs = [];
  }
  addSub(sub){
    this.subs.push(sub);
  }
  notify(){
    this.subs.forEach(sub => sub.cb())
  }
}
function defineReactive(obj, key){
  let value = obj[key];
  let dep = new Dep(); //每一个属性都有一个对应的dep,作为闭包保存
  Object.defineProperty(obj, key, {
    enumerable: true,
    configurable: true,
    get(){
      dep.addSub(Dep.target)
      Dep.target = null;
      return value;
    },
    set(newVal){
      value = newVal
      dep.notify();
    }
  })
}

以上就是vue的思路,vue3之所以要从新实现,主要有这几个原因:

  1. Object.defineProperty的性能开销。

  2. defineReactive一开始就要对要监听的对象所有属性都执行一遍,因为传统方法要将一个对象转换成可监听对象,只能如此。

  3. 添加删除属性的问题。

  4. 还有一点就是这个模块被耦合到了vue里面,新版本可以单独作为一个库来使用。

然后我们来看看同样的功能采用Proxy会怎样实现。

Proxy的实现

将一个对象转换成Proxy的方式很简单,只需要作为参数传给proxy即可;

class Watcher {
  constructor(proxy, key, cb) {
    this.cb = cb;
    Dep.target = this;
    this.value = proxy[key];
  }
}
class Dep {
  constructor(){
    this.subs = []
  }
  addSub(sub){
    this.subs.push(sub);
  }
  notify(newVal){
    this.subs.forEach(sub => {
      sub.cb(newVal, sub.value);
      sub.value = newVal;
    })
  }
}
const observe = (obj) => {
  const deps = {};
  return new Proxy(obj, {
    get: function (target, key, receiver) {
      const dep = (deps[key] = deps[key] || new Dep);
      Dep.target && dep.addSub(Dep.target)
      Dep.target = null;
      return Reflect.get(target, key, receiver);
    },
    set: function (target, key, value, receiver) {
      const dep = (deps[key] = deps[key] || new Dep);
      Promise.resolve().then(() => {
        dep.notify(value);
      })
      return Reflect.set(target, key, value, receiver);
    }
  });
}
var state = observe({x:0})
new Watcher(state, 'x', function(n, o){
  console.log(n, o)
});
new Watcher(state, 'y', function(n, o){
  console.log(n, o)
});
state.x = 3;
state.y = 3;

也许一开始我们只关心x和y,那么就不会对其他的属性做相应的处理,除非添加watcher,其他时间target都是null

以上是“Proxy如何优化vue的数据监听机制问题”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网VUE频道!

--结束END--

本文标题: Proxy如何优化vue的数据监听机制问题

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

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

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

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

下载Word文档
猜你喜欢
  • Proxy如何优化vue的数据监听机制问题
    这篇文章主要介绍Proxy如何优化vue的数据监听机制问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!vue2.x中的实现其本质是new Watcher(data, key, ca...
    99+
    2024-04-02
  • vue数据监听分析Object.defineProperty与Proxy的区别
    这篇文章主要介绍“vue数据监听分析Object.defineProperty与Proxy的区别”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vue数据监听分析Object.defineProper...
    99+
    2023-07-05
  • vue如何用watch监听数据变化
    这篇文章主要介绍“vue如何用watch监听数据变化”,在日常操作中,相信很多人在vue如何用watch监听数据变化问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue如何用watch监听数据变化”的疑惑有所...
    99+
    2023-07-04
  • vue如何使用watch监听指定数据的变化
    目录使用watch监听指定数据的变化vue watch监听多个值使用watch监听指定数据的变化  在vue中,可以使用watch属性来监听data中某个属性值的变化。 &...
    99+
    2024-04-02
  • php如何监听数据库变化
    要监听数据库的变化,可以使用以下两种方法:1. 轮询:在应用程序中设置一个定时器,定期查询数据库以检查是否有变化。可以使用定时器函数...
    99+
    2023-09-09
    php 数据库
  • 关于vue中如何监听数组变化
    目录前言源码部分从哪开始第一步学习呢从图开始看看源码吧前言 前段时间学习了关于vue中响应式数据的原理,(并作了学习笔记vue响应式原理),其实是通过Object.definePro...
    99+
    2024-04-02
  • vue前端测试开发watch如何监听data的数据变化
    本篇内容主要讲解“vue前端测试开发watch如何监听data的数据变化”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vue前端测试开发watch如何监听data的数据变化”吧!watch监听d...
    99+
    2023-06-30
  • 如何通过Java监听MySQL数据的变化
    目录原理开启MySQL的binlog功能Java监听MySQL的binlog实现监听数据变化总结原理 原理:java通过bin-log监控mysql数据变化 binlog :binl...
    99+
    2023-03-14
    java监听mysql数据表变化 java监听数据库变化 监听mysql数据变化
  • Vue中监听数据变化的原理是什么
    这期内容当中小编将会给大家带来有关Vue中监听数据变化的原理是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。浅度监听<!DOCTYPE html>...
    99+
    2024-04-02
  • 解析SQL Server CDC配合Kafka Connect监听数据变化的问题
    写在前面   好久没更新Blog了,从CRUD Boy转型大数据开发,拉宽了不少的知识面,从今年年初开始筹备、组建、招兵买马,到现在稳定开搞中,期间踏过无数的火坑,也许除了这篇还很写...
    99+
    2024-04-02
  • vue如何实时监听input值的变化
    本篇内容介绍了“vue如何实时监听input值的变化”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、vuejs 2.0中js实时监听inp...
    99+
    2023-07-04
  • vue如何实现监听数值的变化并捕捉
    这篇文章主要介绍了vue如何实现监听数值的变化并捕捉的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇vue如何实现监听数值的变化并捕捉文章都会有所收获,下面我们一起来看看吧。1. 封装全局监听方法在main.js...
    99+
    2023-07-04
  • vue中如何监听url地址栏参数变化
    目录vue监听url地址栏参数变化1、传递参数2、监听参数变化vue检测url的变化-Kaiqisan总结vue监听url地址栏参数变化 问题: 在开发过程中我们有可能会遇到一个问题...
    99+
    2023-03-10
    vue监听 监听url地址栏参数 vue地址栏参数
  • Vue数据监听器watch和watchEffect如何使用
    本文小编为大家详细介绍“Vue数据监听器watch和watchEffect如何使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Vue数据监听器watch和watchEffect如何使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入...
    99+
    2023-07-05
  • vue如何监听el-select选择值的变化
    目录监听el-select选择值的变化方法很简单@change就可以实现@change绑定了currStationChangeel-select将选中的值传递到需要的位置方法一方法二...
    99+
    2024-04-02
  • Zabbix对Kafka topic积压数据监控的问题(bug优化)
    目录简述分区自动发现获取监控项“test-group/test/分区X”的Lag最终优化后脚本接入Zabbix1.Zabbix配置文件2.Zabbix自动发现...
    99+
    2024-04-02
  • vue前端测试开发watch监听data的数据变化
    目录watch监听data的数据变化新问题解决1. 先把姓名的值,也加到options里2. 在监听里增加for循环和判断watch监听data的数据变化 上一篇里提到了用eleme...
    99+
    2024-04-02
  • vue项目中的数据变化被watch监听并处理
    目录vue数据变化被watch监听处理监听当前vue文件数据监听vuex中的数据如何正确使用watch监听属性变化基本用法监听object初始化变量触发监听回调vue数据变化被wat...
    99+
    2024-04-02
  • 如何监测和优化OLAP数据库
    如何监测和优化OLAP数据库,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。SQLServer Profiler你可以使用SQL ServerP...
    99+
    2024-04-02
  • 如何实现Flex键盘事件的监听机制
    这篇文章给大家分享的是有关如何实现Flex键盘事件的监听机制的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Flex键盘事件的监听Flex的事件监听机制很完善,下面主要简单的讲一下Flex键盘事件的监听。首先,要理...
    99+
    2023-06-17
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作