Vue响应式数据的原理

这篇具有很好参考价值的文章主要介绍了Vue响应式数据的原理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在 vue2 的响应式中,存在着添加属性、删除属性、以及通过下标修改数组,但页面不会自动更新的问题。而这些问题在 vue3 中都得以解决。

vue3 采用了 proxy 代理,用于拦截对象中任意属性的变化,包括:属性的读写、属性的添加、属性的删除、以及通过下标修改数组,都可以自动更新页面。

proxy 代理:用于在目标对象之前架设一层拦截,外界对该对象的访问,都必须先通过这层拦截,因此可以对外界的访问进行过滤和改写。

另外 vue3 还采用了 reflect 反射,用于对源对象的属性进行操作。

reflect 反射:是一个 JS 的内置对象,它提供了一系列的方法,这些方法和对象中的功能相对应。经常配合 proxy 使用。proxy 用于拦截,reflect 用于操作。

 Proxy 代理的使用【代理对象】:

// 假设这个是我们创建的 reactive 数据
const data = {
  name: "张三",
  age: 21
};

// 创建 proxy 代理 data 对象,添加到 vue 的实例对象中
// 语法:const vm = new Proxy(要代理的数据, 配置对象)
const vm = new Proxy(data, {
  // 当有人读取 vm 的某个属性时调用
  get(target, propName) {
	// target 就是被代理的这个对象,propName 就是当前操作的属性
    console.log(`有人读取了vm身上的${propName}属性`);
    return target[propName]; // 返回代理对象中的这个属性
  },
  // 当有人修改 vm 的某个属性时,或给 vm 添加某个属性时调用
  set(target, propName, value) {
	// value 就是修改的值
    console.log(`有人修改了vm身上的${propName}属性,我要去更新页面了!`);
    return (target[index] = value); // 修改或添加这个属性
  },
  // 当有人删除 vm 的某个属性时调用
  deleteProperty(target, propName) {
    console.log(`有人删除了vm身上的${propName}属性,我要去更新页面了!`);
    return delete target[propName]; // 删除代理对象中的这个属性
  },
});

:proxy 不仅能检测到读取属性和修改属性,还能检测到添加属性和删除属性。所以在 vue3 中添加或删除一个对象中的属性时,页面也会自动更新。

Vue响应式数据的原理,vue.js,javascript,前端

 注:读取时触发 get 函数、修改或添加时触发 set 函数、删除时触发 deleteProperty 函数。

 Proxy 代理的使用【代理数组】:

// 假设这个是我们创建的 reactive 数据
const arr = ["张三", "李四", "王五"];

// 创建 proxy 代理 arr 数组,添加到 vue 的实例对象中
// 语法:const app = new Proxy(要代理的数据, 配置对象)
const app = new Proxy(arr, {
  // 当有人读取 app 的某个值时调用
  get(target, index) {
    // target 就是被代理的这个数组,index 就是当前操作的属性或下标
    console.log(`有人读取了app身上下标${index}的值`);
    return target[index]; // 返回代理数组中的这个值
  },
  // 当有人修改 app 的某个值时,或给 app 添加一个值时调用
  set(target, index, value) {
    // value 就是修改的值
    console.log(`有人修改了app身上下标${index}的值,我要去更新页面了!`);
    return (target[index] = value); // 修改或添加代理数组中的这个值
  },
  // 当有人删除 app 的某个值时调用
  deleteProperty(target, index) {
    console.log(`有人删除了app身上下标${index}的值,我要去更新页面了!`);
    return delete target[index]; // 删除代理数组中的这个值
  },
});

:proxy 支持通过下标操作数组,例如查看数据、修改数据、增加数据。所以在 vue3 中通过下标修改数组时,页面也会自动更新。

Vue响应式数据的原理,vue.js,javascript,前端

 注:在使用 push 等方法的时候,length 属性也会发生变化。所以 vue3 分别判断了 push、pop、unshift、shift 等方法,用于区分拦截的各种情况。

 Proxy 代理的使用【深层数据的问题】

const data = {
  name: "张三",
  age: 20,
  arr: ["a", "b", "c"],
  obj: { q: 1, w: 2 },
};

const app = new Proxy(data, {
  get(target, propName) {
    console.log(`有人读取了app身上的${propName}属性`);
    return target[propName];
  },
  set(target, propName, value) {
    console.log(`有人修改了app身上的${propName}属性,我要去更新页面了!`);
    return (target[propName] = value);
  },
  deleteProperty(target, propName) {
    console.log(`有人删除了app身上的${propName}属性,我要去更新页面了!`);
    return delete target[propName];
  },
});

:proxy 代理深层数据的时候,只会触发 get 函数,并不会触发 set 函数

Vue响应式数据的原理,vue.js,javascript,前端

:proxy 只会拦截第一层数据,所以 vue3 对深层数据进行了循环遍历,重新利用 proxy 代理了深层数据。

原创作者:吴小糖

创作时间:2023.8.12 文章来源地址https://www.toymoban.com/news/detail-644021.html

到了这里,关于Vue响应式数据的原理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue响应式数据的原理

    在 vue2 的响应式中,存在着添加属性、删除属性、以及通过下标修改数组,但页面不会自动更新的问题。而这些问题在 vue3 中都得以解决。 vue3 采用了 proxy 代理,用于拦截对象中任意属性的变化,包括:属性的读写、属性的添加、属性的删除、以及通过下标修改数组,都可以

    2024年02月13日
    浏览(21)
  • Vue源码学习 - 数据响应式原理

    Vue.Js的核心包括一套 “响应式系统”。“响应式”,是指当数据改变后,Vue会通知到使用该数据的代码。例如,视图渲染中使用了数据,数据改变后,视图也会自动更新。 vue2.X的数据响应式是利用 Object.defineProperty() 实现的,通过定义对象属性 getter/setter 拦截对属性的获取和

    2024年02月15日
    浏览(26)
  • Vue3 数据响应式原理

    核心: 通过Proxy(代理): 拦截对data任意属性的任意(13种)操作, 包括属性值的读写, 属性的添加, 属性的删除等… 通过 Reflect(反射): 动态对被代理对象的相应属性进行特定的操作 Vue3的响应式比Vue2好在哪里? 效率更高了,Vue2中假设监听某个对象,该对象中有一万个属性,他要循

    2024年02月11日
    浏览(40)
  • 手写Vue3响应式数据原理

    我们想要对一个对象数据进行处理,从而实现更改dom。但如何更改对一个对象数据进行更改呢? vue2 的双向数据绑定是利⽤ES5 的⼀个 API ,Object.defineProperty()对数据进⾏劫持 结合 发布订阅模式的⽅式来实现的。 vue3 中使⽤了 ES6 的 ProxyAPI 对数据代理,通过 reactive() 函数给每⼀

    2024年02月11日
    浏览(37)
  • JS-27 前端数据请求方式;HTTP协议的解析;JavaScript XHR、Fetch的数据请求与响应函数;前端文件上传XHR、Fetch;安装浏览器插件FeHelper

    早期的网页都是通过后端渲染来完成的,即服务器端渲染(SSR,server side render): 客户端发出请求 - 服务端接收请求并返回相应HTML文档 - 页面刷新,客户端加载新的HTML文档; 服务器端渲染的缺点: 当用户点击页面中的某个按钮向服务器发送请求时,页面本质上只是一些数

    2024年02月16日
    浏览(48)
  • 前端开发攻略---从源码角度分析Vue3的Propy比Vue2的defineproperty到底好在哪里。一篇文章让你彻底弄懂响应式原理。

    Vue的响应式到底要干什么? 无非就是要知道当你 读取 对象的时候,要知道它读了。要做一些别的事情 无非就是要知道当你 修改 对象的时候,要知道它改了。要做一些别的事情 所以要想一个办法, 把读取和修改的动作变成一个函数 ,读取和修改的时候分别调用对应的函数

    2024年04月17日
    浏览(37)
  • 前端开发,Vue的双向数据绑定的原理

    目录 一、什么是前端 二、Vue.JS框架 三、双向数据绑定 四、Vue的双向数据绑定的原理 前端通常指的是网页或应用程序中用户直接交互和感知的部分,也称为客户端。前端开发涉及使用HTML、CSS和JavaScript等技术来构建用户界面和交互功能。前端开发人员负责确保网站或应用程序

    2024年02月19日
    浏览(46)
  • vue响应式原理

    以下是Vue响应式原理的简要解释: 1、Object.defineProperty: Vue使用了Object.defineProperty这个JavaScript特性,它允许在对象上定义新的属性或修改现有属性的特性。vue通过这个特性来劫持(监听)数据的变化。这意味着,当你访问或修改对象的属性时,Vue能够介入这个过程,执行一些

    2024年01月24日
    浏览(29)
  • 图解 Vue 响应式原理

    Vue 初始化 模板渲染 组件渲染 为了便于理解,本文将从以下两个方面进行探索: 从 Vue 初始化,到首次渲染生成 DOM 的流程。 从 Vue 数据修改,到页面更新 DOM 的流程。 先从最简单的一段 Vue 代码开始: \\\"\\\"\\\" \\\"\\\"\\\" 这段代码很简单,最终会在页面上打印一个 hello world,它是如何实

    2024年02月16日
    浏览(22)
  • vue3响应式原理

    Vue 3 中的响应式原理是通过使用 ES6 的 Proxy 对象来实现的。在 Vue 3 中,每个组件都有一个响应式代理对象,当组件中的数据发生变化时,代理对象会立即响应并更新视图。 具体来说,当一个组件被创建时,Vue 会为组件的 data 对象创建一个响应式代理对象。这个代理对象可以

    2024年02月15日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包