Vue2中给对象添加新属性界面不刷新

news/2024/11/23 5:51:13/

Vue2中给对象添加新属性界面不刷新?

Vue2.x的响应式

实现原理

  • 对象类型:通过Object.defineProperty()对属性的读取、修改进行拦截(数据劫持)。
  • 数组类型:通过重写更新数组的一系列方法来实现拦截。(对数组的变更方法进行了包裹)。
Object.defineProperty(data, 'count', {get () {}, set () {}
})

存在问题

  • 新增属性、删除属性, 界面不会更新。
  • 直接通过下标修改数组, 界面不会自动更新。

解决方案

  • 使用Vue.setVue.delete或者vm.$setvm.$delete这些API

模拟vue2的响应式

//源数据
let person = {name:'张三',age:18
}
//模拟Vue2中实现响应式
let p = {}
Object.defineProperty(p,'name',{configurable:true,get(){ //有人读取name时调用return person.name},set(value){ //有人修改name时调用console.log('有人修改了name属性,我发现了,我要去更新界面!')person.name = value}
})
Object.defineProperty(p,'age',{get(){ //有人读取age时调用return person.age},set(value){ //有人修改age时调用console.log('有人修改了age属性,我发现了,我要去更新界面!')person.age = value}
})

vue3的响应式

结论

在vue3中已经不存在上述的问题了

实现原理

  • 通过 Proxy(代理): 拦截对象中任意属性的变化, 包括:属性值的读写、属性的添加、属性的删除等。
  • 通过Reflect(反射): 对源对象的属性进行操作。
let person = {name:'YK菌',age:18
}const p = new Proxy(person,{//有人读取p的某个属性时调用get(target,propName){console.log(`有人读取了p身上的${propName}属性`)// return target[propName]return Reflect.get(target,propName)},//有人修改p的某个属性、或给p追加某个属性时调用set(target,propName,value){console.log(`有人修改了p身上的${propName}属性,我要去更新界面了!`)// target[propName] = valuereturn Reflect.set(target,propName,value)},//有人删除p的某个属性时调用deleteProperty(target,propName){console.log(`有人删除了p身上的${propName}属性,我要去更新界面了!`)// return delete target[propName]return Reflect.deleteProperty(target,propName)}
})

为什么要使用Reflect,ECMA正在把Object上的方法转移到Reflect上面去

因为要让框架变得更加健壮,所以需要捕获错误,要不然一发生错误就运行不了了
利用Object.defineProperty捕获错误需要使用trycatch,不易读
在这里插入图片描述

而使用Reflect,因为Reflect会有返回值,直接使用if判断就可以捕获错误了
在这里插入图片描述


http://www.ppmy.cn/news/102629.html

相关文章

Polygon zkEVM Prover的 RPC功能

1. 引言 https://github.com/0xPolygonHermez/zkevm-prover为Polygon zkEVM生成proof,其主要承担3类RPC功能: 1)作为Aggregator RPC client(Prover模块)2)作为Executor RPC server(Executor模…

如何将数据从旧电脑传输到新电脑,哪种文件传输方式更好

迁移到新的Windows 10 电脑是一个令人兴奋的时刻,尤其是如果您有幸从我们现在可用的最佳Windows笔记本电脑列表中选择一个选项。问题是您熟悉的文件位于旧电脑上,并且您不想重新开始。为了简化电脑之间的转换,可以使用以下七种方式进行文件传…

䲟鱼优化算法(ROA)(含MATLAB代码)

先做一个声明:文章是由我的个人公众号中的推送直接复制粘贴而来,因此对智能优化算法感兴趣的朋友,可关注我的个人公众号:启发式算法讨论。我会不定期在公众号里分享不同的智能优化算法,经典的,或者是近几年…

CompletableFuture与多线程结合使用

公众号请关注"果酱桑", 一起学习,一起进步! 前言 在Java 8中,引入了CompletableFuture类,它是Future的增强版,提供了更加灵活的异步编程方式,能够更好地利用多线程的优势。本文将详细讲解CompletableFuture的使用方法…

【运维】speedtest测试

目录 docker 布署 布署云端 docker布署 云端放置于已有容器里 librespeed/speedtest: Self-hosted Speedtest for HTML5 and more. Easy setup, examples, configurable, mobile friendly. Supports PHP, Node, Multiple servers, and more (github.com) docker 布署 获取…

Hadoop3.1.4分布式搭建

Hadoop3.1.4分布式搭建 1. 基础环境准备 1.1 实验网络规划 hostnameip addrroleotherk8s-m13310.10.10.133NameNode, DataNode, NodeManageerk8s-m13410.10.10.134SecondaryNameNode, DataNode, NodeManageerk8s-m13510.10.10.135ResourceManager, DataNode, NodeManageerk8…

链表反转方法汇总

反转范围之前有节点,prev就指向该节点,没有就prevnull; 一、头插法 class Solution {public ListNode reverseList(ListNode head) {ListNode header new ListNode(-1);ListNode cur head;while(cur ! null) {ListNode tmp cur.next;cur.…

香豆素荧光标记652966-03-5,ATTO425 acid,ATTO 425 羧酸,进行简析说明

中文名称:ATTO 425 羧酸 英文名称:ATTO425 COOH,ATTO-425 carboxylic acid 规格标准:10mg,25mg,50mg CAS:652966-03-5 分子式:C22H27NO6 分子量:401.46结构式&#xff1a…