vue项目统一响应_Vue响应式原理及总结

Vue 的响应式原理是核心是通过 ES5 的保护对象的 Object.defindeProperty 中的访问器属性中的 get 和 set 方法,data 中声明的属性都被添加了访问器属性,当读取 data 中的数据时自动调用 get 方法,当修改 data 中的数据时,自动调用 set 方法,检测到数据的变化,会通知观察者 Wacher,观察者 Wacher自动触发重新render 当前组件(子组件不会重新渲染),生成新的虚拟 DOM 树,Vue 框架会遍历并对比新虚拟 DOM 树和旧虚拟 DOM 树中每个节点的差别,并记录下来,最后,加载操作,将所有记录的不同点,局部修改到真实 DOM 树上。

虚拟DOM (Virtaul DOM): 用 js 对象模拟的,保存当前视图内所有 DOM 节点对象基本描述属性和节点间关系的树结构。用 js 对象,描述每个节点,及其父子关系,形成虚拟 DOM 对象树结构。

项目中常遇到的关于vue响应式的记录与总结:

因为只要在 data 中声明的基本数据类型的数据,基本不存在数据不响应问题,所以重点介绍数组和对象在vue中的数据响应问题,vue可以检测对象属性的修改,但无法监听数组的所有变动及对象的新增和删除,只能使用数组变异方法及$set方法。

可以看到,arrayMethods 首先继承了 Array,然后对数组中所有能改变数组自身的方法,如 push、pop 等这些方法进行重写。重写后的方法会先执行它们本身原有的逻辑,并对能增加数组长度的 3 个方法 push、unshift、splice 方法做了判断,获取到插入的值,然后把新添加的值变成一个响应式对象,并且再调用 ob.dep.notify() 手动触发依赖通知,这就很好地解释了用 vm.items.splice(newLength) 方法可以检测到变化。。

1. 向响应式的数组或者对象中修改已有的属性的方法

当想要修改对象或者属性,并非新增属性时,一个已经在 data 中声明过的响应式数据,可以直接操作改变,数据改变会经过上图的步骤,触发视图改变。直接obj.xxx = xxx 即可,数组除外,但是后台传过来的 json 数组,数组中嵌套的对象也可以直接修改数组中的对象,因为 Object.defindeProperty 的缺陷导致无法监听数组的变动,但始终会深度遍历data中数据,给数组中嵌套的对象添加上 get 和 set 方法,完成对对象的监听。所以数组中嵌套的对象的情况是可以直接修改数组中的对象,并且保持响应式。

2. 向响应式的数组或者对象中新增一个响应式的属性的方法this.$set()或者数组变异方法

即使是一个后台传过来的 json 数组,也可以使用this.$set向数组中的其中一个对象中添加一个响应式的属性,例如 this.$set(arr[0], 'xxx', xxx) 。或者使用数组变异方法例如splice,更多数组变异方法可以参考vue文档。

3. data中声明过的数组或者对象,整体替换数组或者对象保持响应式

向响应式的数组和对象替换为新的响应式数据,可直接复制,因为data中声明的数据已经添加了访问器属性setter,当重新赋值一个新的堆内存地址时,该数组或者对象也会被循环遍历添加访问器属性,所以也是有响应式的。

4.  vue无法监听对象的新增和删除,直接通过obj.xxx = xxx新增一个没有的属性,同时修改当前组件的一个响应式的数据,会重新触发当前组件重新render,可以让非响应式数据也保持更新状态(并非响应式) 。

给一个数据添加一个非响应式的数据,例如一个已经在data中声明过的数据obj,obj.xxx=xxx,新增一个原本没有的数据,同时修改组件中一个其他的响应式数据,该obj也会同步更新到最新的数据,另一种情况,当你向一个对象或者数组中同时增加一个响应式和非响应式数据,非响应式数据也会同步更新到页面。

总结:只要触发当前组件重新render,就可以让数据保持更新的状态,例如this.$forceUpdate()。

为什么vue不能监听数组的变化?

Object.defindProperty虽然能够实现双向绑定了,但是还是有缺点,只能对对象的属性进行数据劫持,所以会深度遍历整个对象,不管层级有多深,只要数组中嵌套有对象,就能监听到对象的数据变化无法监听到数组的变化,Proxy就没有这个问题,可以监听整个对象的数据变化,所以用vue3.0会用Proxy代替definedProperty。

最后实现一个数据双向绑定原理

更深的底层原理还在学习中,完全消化以后会继续分享,嗯,就酱~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/563105.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

lua虚拟机字节码修改_LUA虚拟机的字节码怎么看?

A : 8 bitsB : 9 bitsC : 9 bitsAx : 26 bits (A, B, and C together)Bx : 18 bits (B and C together)sBx : signed Bx比如这段:function y(...) print(...) end1 [1] GETTABUP 0 0 -1 ; _ENV "print"2 [1] VARARG 1 0 ; VARARG will set L->top3 [1]…

python数据结构中文版_Python官方入门教程_中文版_5.数据结构

5. 数据结构本章将详细介绍一些您已经了解的内容,并添加了一些新内容。5.1. 列表的更多特性列表数据类型还有很多的方法。这里是列表对象方法的清单:list.append(x)在列表的末尾添加一个元素。相当于 a[len(a):] [x] 。list.extend(iterable)使用可迭代…

xss挖掘思路分享_新手指南 | permeate靶场漏洞挖掘思路分享

简介最近在逛码云时候发现permeat靶场系统,感觉界面和业务场景设计的还不错.所以过来分享一下.同时也是分享一下我平时挖掘漏洞的一些思路吧,这篇文章里虽然只简单介绍其中三种漏洞类型,但也是想是一个抛转引玉吧,给web安全新手提供一些挖掘思路.下载地址:GitHub地址…

dom4j实现为list添加父节点_Heap 堆的实现

堆(数据结构)什么是堆堆(Heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵完全二叉树的数组对象堆的性质这种用数组实现的二叉树,假设节点的索引值为index,那么:节点的左孩子节点是 2*index1,节点的右孩…

python concurrent queue_Python的并发并行[2] - 队列[0] - queue 模块

queue模块/ queue Module1常量/ ConstantsPass2函数/ FunctionPass3类/ Class3.1 Queue类类实例化:queue queue.Queue(maxsize0)类的功能:用于生成一个先入先出队列实例传入参数: maxsizemaxsize: int类型,队列的最大值,无空间时阻塞&#xf…

acer软件保护卡清除工具clear_如何清除 APT 缓存来回收宝贵的磁盘空间 | Linux 中国...

导读:在本教程中,我将解释什么是 APT 缓存、为什么会使用它、为什么你要清理它,以及关于清理 APT 缓存你应该知道的其他事情。本文字数:2132,阅读时长大约:3分钟https://linux.cn/article-12787-1.html作者…

检测正常和不正常图_医生提醒:激素正常不等于内分泌正常,带你走出内分泌失调误区...

内分泌失调是女性常见的问题,特别是压力较大的都市女性,常常因为内分泌失调而导致月经紊乱,同时皮肤状态也变得糟糕,让她们很是心烦。一旦怀疑自己是内分泌失调,不少女性都会进行相应的激素检测,但如果检测…

linux设置挂载服务端防火墙_「rpcbind」Linux下nfs+rpcbind实现服务器之间的文件共享(mount 挂载) - seo实验室...

rpcbind1、安装nfs和rpcbind检查自己的电脑是否已经默认安装了nfs和rpcbind:rpm -aq | grep nfsnfs-utils-1.2.3-54.el6.x86_64nfs4-acl-tools-0.3.3-6.el6.x86_64nfs-utils-lib-1.1.5-9.el6.x86_64rpm -aq | grep rpcbindrpcbind-0.2.0-11.el6.x86_64这表示系统已经…

antd 判断input输入内容是否大于_Python基础语法 | 代码规范amp;判断语句amp;循环语句...

Python基础语法代码的执行顺序从上到下从左到右代码规范模块名,包名,普通数据量一般小写字母,多个单词之间用 _ 连接不要用系统定义的名称,具有特殊意义的表示符,如:doc,txt之类的每行代码不易过长单个字母…

zstd安装_PHP: 安装 - Manual

安装此 PECL 扩展未与PHP 捆绑。An example installation procedure on Ubuntu 18.04 with PHP 7.2:// Dependencies$ apt install build-essential libprotobuf-dev libboost-dev openssl protobuf-compiler liblz4-tool zstd// PHP with the desired extensions; php7.2-dev…

小米手环导出心率_这个功能有意思,小米11支持指纹检测心率,没有手环也不怕...

原标题:这个功能有意思,小米11支持指纹检测心率,没有手环也不怕昨晚,小米发布了新一代数字旗舰小米11,在处理器和屏幕等方面都做了升级,相比于这些重点,有一项新功能的介绍篇幅不是很多&#xf…

用单片机测量流体流速的_金属管转子流量计基本测量原理

金属管转子流量计的主体构件是一根金属材质的锥形测量管,测量元件是一个内置磁钢的转子(或称浮子),故而得名。金属管的锥度通常在4左右,下端截面积略小于上端;转子直径略小于金属管内径,形成一个…

css如何调整红心样式_在JavaScript应用程序中包含CSS的多种方法「渡一」

原文链接:https://css-tricks.com/the-many-ways-to-include-css-in-javascript-applications/,作者:Dominic Magnifico如有翻译不准确,请多指正。欢迎来到这个在前端开发领域极具争议性的话题!我相信读到这篇文章的大…

小新pro13 重装注意_新款小新pro 13注意什么?买前必读

导读:看到这一款本本,你的感觉是什么呢?精巧、美丽,性能强劲还是高分辨的屏幕呢?一起看一看2020款的联想(Lenovo)小新Pro13,要注意哪些事项?请听小编简单跟你唠几句~1、买联想小新pro的&#xf…

服务禁止方法_Linux禁止ping以及开启ping的方法

今天浏览一个网站,本着好奇的心态ping一下,发现不管是ping域名和IP都是不通的。这就比较郁闷了,后来百度后知道原来服务器是可以设置禁止ping的,看来是我孤陋寡闻了,接下来给大家分享一下服务器如何禁止ping。Linux默认…

java 多态判断非空_Java核心技术(四):继承

本章目录:一、类、超类和子类1.多态2.动态绑定3.阻止继承:final类和方法4.抽象类5.访问修饰符总结二、Object类:所有类的父类1.equals方法2.hashcode方法3.toString方法三、对象包装器与自动装箱四、反射1.Class类2.捕获异常3.利用反射分析类…

互相引用 spring_听说你还不知道Spring是如何解决循环依赖问题的?

作者:Vt前言Spring如何解决的循环依赖,是近两年流行起来的一道Java面试题。其实笔者本人对这类框架源码题还是持一定的怀疑态度的。如果笔者作为面试官,可能会问一些诸如“如果注入的属性为null,你会从哪几个方向去排查”这些场景…

打印多页时两边取消留白_办公必备技巧:Word打印技巧大全

打印是每一位办公族都要掌握的一项最基础的技能。平常在用WORD写作、对文章进行排版等,最终我们都是需要将其打印到纸张上。在打印中有着众多的操作技巧,如果你还不会,那今天易老师就来给你科普一下。本文目录第一部分:基础打印操…

中raise抛出异常_Python 异常处理知识点汇总,五分钟就能学会 !

异常处理在任何一门编程语言里都是值得关注的一个话题,良好的异常处理可以让你的程序更加健壮,清晰的错误信息更能帮助你快速修复问题。在Python中,和不分高级语言一样,使用了try/except/finally语句块来处理异常,如果…

python中print语法错误_Python 3.x中使用print函数出现语法错误(SyntaxError: invalid syntax)的原因...

在安装了最新版本的Python 3.x版本之后,去参考别人的代码(基于Python 2.x写的教程),去利用print函数,打印输出内容时,结果却遇到print函数的语法错误:SyntaxError: invalid syntax这是因为Python 2.x升级到Python 3.x&…