iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > Python >详解Vue响应式的部分实现
  • 294
分享到

详解Vue响应式的部分实现

Vue响应式实现Vue响应式 2022-12-08 20:12:16 294人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录什么是响应式Vue2与vue3响应式之间的区别使用Object.defineProperty监听对象使用Object.defineProperty监听对象使用es6的Proxy实

什么是响应式

简单来说当数据发生变化时,对数据有依赖的代码会重新执行

例如在Vue中,当我们的数据发生改变,界面上对该数据的引用组件会重新渲染

组件data的数据一旦变化,立即出发视图的更新;

computed属性在依赖发生变化时,自动重新计算新值;提供watch监听器,可以监听到数据的变化

Vue2与Vue3响应式之间的区别

  • Vue2使用ES5的defineProperty实现
  • Vue3使用的是ES6的propxy.(PS:这也就是为什么Vue2不支持IE7/8,而Vue3不支持IE11.)

使用Object.defineProperty监听对象

该方法允许精确地添加或修改对象的属性,并返回此对象。

Object.defineProperty()方法会在直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象

备注:(应当直接在object构造器对象上调用此方法,而不是在任意一个object类型的实例上调用)

语法:Object.defineProperty(obj, prop, descriptor)

  • obj:要设置属性的对象;
  • prop:要设置的属性名,这个属性可以是已存在也可以是不存在的;
  • descriptor:要定义或修改的属性描述符。该参数接收一个对象,用来对属性进行描述。如value(值),writable(是否可重写),enumerable(是否可枚举)等

枚举时使用for...in 或 Object.keys方法可以改变这些属性的值,默认情况下,使用 Object.defineProperty() 添加的属性值是不可修改(immutable)的。

对象里目前存在的属性描述符有两种主要形式:数据描述符和存取描述符

  • 数据描述符:是一个具有值的属性,该值是可写的,也可以是不可写的
  • 存取描述符:由getter函数和setter函数所描述的属性

一个描述符只能是这两者其中之一,不能同时是两者

使用Object.defineProperty监听对象

利用 Object.defineProperty 重写 getset,将对象属性的赋值和获取变成函数,我们可以实现一个简单的双向绑定

  • get: 属性的 getter 函数,如果没有 getter,则为 undefined。当访问该属性时,会调用此函数。该函数的返回值会被用作属性的值。默认为 undefined。
  • set: 属性的 setter 函数,如果没有 setter,则为 undefined。当属性值被修改时,会调用此函数。默认为 undefined。
//实现一个简单的双向绑定
const data = {}
const name = 'xiaowanzi'
Object.defineProperty(data, 'name', {
  get: function () {
    console.log('get')
    return name
  },
  set: function (newVal) {
    console.log('set')
    name = newVal
  }
})
//测试
console.log(data.name)//get xiaowanzi
data.name = 'list'//set

如果我们想让对象的所有属性都具有响应式,就需要对全部属性进行遍历,实现getter和setter:

//实现Vue响应式原理
let obj = {
  name: 'aaa',
  age: 18
}
//获取obj对象的所有key
const keys = Object.keys(obj)//Object.keys()返回一个由一个给定对象的资深可枚举属性组成的数组,数组中的属性名的排列顺序和正常循环遍历该对象时返回的顺序一致
//遍历Key数组,对obj对象的每一个属性进行处理
keys.forEach(key => {
  //使用value变量保存key对应的属性值
  let value = obj[key]
  //使用Object.defineProperty
  Object.defineProperty(obj, key, {
    get() {//当获取属性时,回来到这里
      console.log(`${key}属性被获取`)
      return value
    },
    set(newValue) {//当修改属性时,会来到这里,并且设置的值会传给newValue
      console.log(`${key}属性被修改`)
      //这里不能写成obj[key]=newValue
      //如果这样写相当于又对该属性进行修改值,又会进入set,就死循环了
      value = newValue
    }
  })
})
​
//现在我们已经可以实现监听obj对象的读取与修改了
console.log(obj.name)//在打印'aaa'之前会先打印'name被获取',也就是说监听到属性的获取。
obj.name = 'bbb'//打印name属性被修改,也就是说监听到了属性的改变
​
//实现Vue响应式原理
let obj={
  name:'aaa',
  age:18
}
//获取obj对象的所有key
const keys=object.keys(obj)//Object.keys()返回一个由一个给定对象的资深可枚举属性组成的数组,数组中的属性名的排列顺序和正常循环遍历该对象时返回的顺序一致
//遍历Key数组,对obj对象的每一个属性进行处理
keys.forEach(key=>{
  //使用value变量保存key对应的属性值
  let value = obj[key]
  //使用Object.defineProperty
  Object.defineProperty(obj,key,{
      get(){//当获取属性时,回来到这里
        console.log(`${key}属性被获取`)
        return value
      },
      set(newValue){//当修改属性时,会来到这里,并且设置的值会传给newValue
        console.log(`${key}属性被修改`)
        //这里不能写成obj[key]=newValue
        //如果这样写相当于又对该属性进行修改值,又会进入set,就死循环了
        value=newValue
      }
  })
})
​
//现在我们已经可以实现监听obj对象的读取与修改了
console.log(obj.name)//在打印'aaa'之前会先打印'name被获取',也就是说监听到属性的获取。
obj.name='bbb'//打印name属性被修改,也就是说监听到了属性的改变

缺点

可以实现监听对象的属性,但是它没有办法做到对对象新增的属性进行监听,同时也没有办法做到对数据进行监听

使用ES6的Proxy实现监听对象

api就是用来实现监听对象的,而且该API对数组同样也是有效果的,在使用Proxy时,通常会搭配Reflect一起使用 Proxy

用于创建代理对象,从而实现基本操作的拦截和自定义(如属性的查找,赋值,枚举,函数调用等)

术语:

  • handler:包含捕捉器(trap)的占位符对象,可译为处理器对象。
  • traps:提供属性访问的方法。这类似于操作系统中捕获器的概念。
  • target:被 Proxy 代理虚拟化的对象。它常被作为代理的存储后端。根据目标验证关于对象不可扩展性或不可配置属性的不变量(保持不变的语义)

语法:

const p = new Proxy(target, handler)

1.第一个参数target:要包装的目标对象

2.第二个参数handle:接收一个对象,内部定义了操作目标对象时的方法;

参数:

  • target:要使用 Proxy 包装的目标对象(可以是任何类型的对象,包括原生数组,函数,甚至另一个代理)。
  • handler:一个通常以函数作为属性的对象,各属性中的函数分别定义了在执行各种操作时代理 p 的行为。

方法

  • Proxy.revocable()
  • 创建一个可撤销的Proxy对象。

Reflect

是一个内置的对象,它提供拦截 javascript 操作的方法。Reflect不是一个函数对象,因此它是不可构造的。

通过给对象设置代理,我们可以拦截对象属性的取值/赋值操作。

举个例子:

const student = {
  age: 23
}
const handler = {
  get(target, prop) {
    console.log("读值:", key, value);
    target[key] = value;
    return target[prop]
  },
  set(target, key, value) {
    console.log("设置值", key, value);
    target[key] = value;
    return true
  }
}
const proxy = new Proxy(studengt, handler)
console.log(proxy.age)//23
//proxy.age=32   //32

实现代码

//Proxy+Reflect
let obj = {
  name: 'aaa',
  age: 18
}
//第一个参数为要代理的对象,第二个参数位hander
const proxy = new Proxy(obj, {
  //当访问第一个属性的时候会得到getter
  //同时会传递三个参数
  //target要进行代理对象,这里就是obj
  //key被访问的属性
  //receiver用来绑定this
  get(target, key, receiver) {
    console.log(`${key}属性被访问`)
    return Reflect.get(target, key, receiver)
  },
  //当某一属性修改的时,回来到Setter
  // 同时会传递四个参数
  // target要进行代理的对象,这里就是obj
  // 可以被访问的属性
  // newValue新修改的值
  // receiver用来绑定this
  set(target, key, newValue, receiver) {
    console.log(`${key}属性修改`)
    return Reflect.set(target, key, newValue, receiver)
  }
})
// 以上代码执行完,得到的就是proxy对象就是obj对象的代理
// 我们只需要修改代理对象的就可以做到修改原型对象的效果
// 而且我们对代理对象的修改使我们能够监听到的
console.log(proxy.name)
proxy.name = 'bbb'

到此这篇关于详解Vue响应式的部分实现的文章就介绍到这了,更多相关Vue响应式内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 详解Vue响应式的部分实现

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

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

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

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

下载Word文档
猜你喜欢
  • 详解Vue响应式的部分实现
    目录什么是响应式Vue2与Vue3响应式之间的区别使用Object.defineProperty监听对象使用Object.defineProperty监听对象使用ES6的Proxy实...
    99+
    2022-12-08
    Vue响应式实现 Vue响应式
  • VUE响应式原理的实现详解
    目录总结前言 相信vue学习者都会发现,vue使用起来上手非常方便,例如双向绑定机制,让我们实现视图、数据层的快速同步,但双向绑定机制实现的核心数据响应的原理是怎么样的呢,接下来让我...
    99+
    2024-04-02
  • Vue.js3.2响应式部分的优化升级详解
    目录背景响应式实现原理依赖收集派发通知副作用函数响应式实现的优化依赖收集的优化响应式 API 的优化trackOpBit 的设计总结背景 Vue 3 正式发布距今已经快一年了,相信很...
    99+
    2024-04-02
  • 详解VUE响应式原理
    目录1、响应式原理基础2、核心对象:Dep与Watcher3、收集依赖与更新依赖3.1 收集依赖3.2 更新依赖4、源码调试4.1 测试的页面代码1、对象说明2、Dep与Watche...
    99+
    2024-04-02
  • 怎么实现Vue的响应式
    这篇文章主要介绍了怎么实现Vue的响应式,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。简易版 以watch为切入点watch是平时开发中使用...
    99+
    2024-04-02
  • 详解vue3 响应式的实现原理
    目录核心设计思想Vue.js 2.x 响应式Vue.js 3.x 响应式依赖收集:get 函数派发通知:set 函数总结源码参考核心设计思想 除了组件化,Vue.js 另一个核心设计...
    99+
    2024-04-02
  • Vue响应式系统的原理详解
    目录vue响应式系统的基本原理1.回顾一下Object.defineProperty的用法2.实战1:使用 Object.defineProperty 对 person的age属性 ...
    99+
    2024-04-02
  • Vue响应式原理的示例详解
    Vue 最独特的特性之一,是非侵入式的响应系统。数据模型仅仅是普通的 JavaScript 对象。而当你修改它们时,视图会进行更新。聊到 Vue 响应式实现原理,众多开发者都知道实现...
    99+
    2024-04-02
  • vue+element怎么实现响应式
    本篇内容介绍了“vue+element怎么实现响应式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、如何使用Element UI在Vue项...
    99+
    2023-07-05
  • rem实现响应式布局的思路详解
    目录正文为什么要使用响应式布局?如何实现响应式布局呢?那什么是媒体查询?那么什么是rem怎么计算出各个尺寸屏幕下的html元素font-size要设置为多少呢完结感想正文 你是不是...
    99+
    2023-03-20
    rem响应式布局思路 rem响应式
  • 一文详解Vue中响应式原理
    废话不多说,直接进入正题,响应式在日常开发中的应用是很常见的,这里举个简单的例子:let a=3 let b=a*10 console.log(b)//30 a=4 console.log(b)//40这时候我们想让b=4*10,这样显然是...
    99+
    2023-05-14
    前端 Vue.js 设计模式
  • Vue响应式原理与虚拟DOM实现步骤详细讲解
    目录一、什么是响应式系统二、实现原理三、虚拟DOM实现四、总结一、什么是响应式系统 在Vue中,我们可以使用data属性来定义组件的数据。这些数据可以在模板中使用,并且当这些数据发生...
    99+
    2023-05-13
    Vue响应式原理 Vue虚拟DOM
  • 实现一个VUE响应式属性装饰器详析
    目录前言不使用任何的响应Api使用 reactive 实现使用 ref 实现使用装饰器实现实现Reactive装饰器实现Watch装饰器总结前言 使用面向对象的开发思想难免会用到类,...
    99+
    2024-04-02
  • vue中v-model和响应式的实现原理解析
    目录v-model响应式实现v-model 首先要了解v-model就是vue帮我们封装的语法糖,真正实现靠的还是:v-bind:绑定响应式数据 触发 input 事件 并传递数据 ...
    99+
    2024-04-02
  • 深入理解Vue响应式原理及其实现方式
    目录Vue的响应式Vue2的响应式原理Vue3的响应式原理深入理解响应式1.数据初始化2.对象的数据劫持Vue的响应式 用过Vue这个框架的人应该都知道,数据驱动是Vue框架的核心,...
    99+
    2023-05-19
    Vue响应式原理 Vue响应式原理实现
  • three.js响应式设计实例详解
    目录1-canvas 的响应式布局示例:三维插图2-自适应设备分辨率总结源码地址:github.com/buglas/thre… 1-canvas 的响应式布局 can...
    99+
    2024-04-02
  • 详解vue数据响应式原理之数组
    目录src/core/observer/index.jssrc/core/observer/array.js arrayMethods总结src/core/observer/inde...
    99+
    2024-04-02
  • Vue中响应式系统实现原理图文讲解
    目录框架组件结构源码解析在哪里绑定vue实例与watcher实例vue实例中的data响应式初始化对Object的变化监测框架 每个组件实例都会对应一个watcher实例,在组件渲...
    99+
    2023-03-20
    Vue响应式系统 Vue响应式原理
  • Spring-webflux 响应式编程的实例详解
    目录1. 前言2. Spring-webflux简介3. 什么是“响应式”4. Spring-webflux的响应式API5. Spring MVC 还是 W...
    99+
    2024-04-02
  • Vue怎么实现响应式数据更新
    本文小编为大家详细介绍“Vue怎么实现响应式数据更新”,内容详细,步骤清晰,细节处理妥当,希望这篇“Vue怎么实现响应式数据更新”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。首先假设我们在祖辈时候传入进来是个动态...
    99+
    2023-07-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作