大家好,我是GGBOND的前端,今天我们将谈论VUE2的响应原则。
什么是回应?
数据更改后,该页面将再次渲染。这是VUE响应类型,如下图所示
今天,我们专注于实施数据劫持,VUE中的VUE问题以及相应的解决方案。
[]()定义:object.defineProperty()方法将直接定义对象上的新属性,或修改对象的现有属性,然后返回此对象。
[]()语法:object.defineProperty(OBJ,Prop,Descriptor)
[]()范围:
[]()1。obj,添加属性的对象
[]()2。Prop,要定义或修改的属性的名称或[符号]
[]()3。描述符,定义或修改的属性描述符
[]()前两个参数已被充分理解。在这里,我们关注第三个参数:属性描述符。
[]()对象中当前存在的属性描述符包括配置,枚举,值,可写,get,set。
[]()和VUE中对象的监视主要是通过属性描述符的最后两个属性,获取并设置
[]()l得到
[](]()属性的getter函数,当访问此属性时,该函数被称为。执行过程中无参数,但会引入该对象(由于继承,这不一定是定义属性的对象)。此函数的返回值用作属性的值。
[]()L集
[](]()属性的setter函数,当修改属性值时,将调用此函数。此方法接受一个参数(即给定的新值),在分配该对象时将传递该对象。DEFEALTundefine。
[]()以下代码显示:
[]()定义响应函数定义反应性
[]()调用定义性,数据更改以触发更新方法以实现数据响应
[]()可以监视上述情况以更改对象的更改。
[]()但是,在多个属性的情况下,它需要旅行。
[]()如果有嵌套对象的情况,则有必要
[]()()在向密钥分配值时,有必要在集合属性中恢复
[]()上面的示例可以实现对对象的基本响应,但是仍然有很多问题。
[]()例如,现在删除并将属性操作添加到对象中,它不能被劫持:
如何解决这些问题?让我们稍后再谈谈。
[]()首先,vue对数组的响应没有使用object.defineproperty。主要原因是以下两点:
[]()1。object.defineProprety,您可以监视阵列属性的更改,但是由于严重的性能消耗,它已成为废物案例。
[]()实际上,object.defineProperty可以监视数组属性中的更改。以下是测试代码:
[]()l直接复制代码控制台输出
[]()实际上,许多人在Internet上说对象。DefineProperty无法通过竞标来修改数组的数据。但是我如何通过测试自己来检测修改?它们都错了吗?
[]()让我们继续测试长度的变化,
[]()
[]()让我们看一下控制台的输出。数据的长度成功。看来他们的答案确实是错误的。
[]()L,所以我继续找到它,最后找到了它。确实不是object.defineproperty()的问题。这是对Vue本身的限制。当数据是数组时,它将停止监视数据属性。
[]()另一个问题是,如果存在深层对象关系,则需要深入监视,从而导致巨大的性能问题。
[]()因此,object.defineproperty **具有监视阵列的竞标能力,但是在实施VUE2时,此功能从性能/经验的成本效益中放弃。** **
[]()当我们收听阵列API时,我发现object.defineproperty不是很好
[]()您可以看到数据的API无法劫持,因此无法实现数据响应。
[]()so在VUE2中,对数组的监视不使用Object.defineProperty,而是添加了设置和删除API,并重写了数组API方法。
同时,官方网站还提到Vue无法检测到以下数组中的更改:
[]()1。无法检测到对象属性的添加和删除
[]()1。当您使用索引直接设置数组项目时,例如::
[]()2。例如,当您修改数组的长度时,例如:
[]()回答这些不成功的问题,Vue必须给出解决方案。有什么细节?
[]()
对于已创建的示例,VUE不允许动态添加root -Level响应推进。实际在做对象。定义property。语法是:
您也可以使用VM。$设置实例方法,这也是整个边界的vue.set方法的别名:
有时,您可能需要将多个新属性(属性)分配给现有对象,例如使用object.assign()或_.extend()。情况,您应该使用原始对象创建一个新对象,并与属性混合。
为了解决.Items [indexoFitem] = newValue更新的问题,可以将以下两种方法作为与vm.Items [indexoFitem] = newValue相同的效果。同时,它也将在响应系统中进行更新:
您也可以使用VM。$设置实例方法。此方法是全局方法vue.set的别名:
如果数组中有对象,则需要对每个属性进行监视。如果嵌套对象需要深度监视,从而导致性能问题。因此,默认情况下,VUE不会在 - 深度监视中执行。
但是,如果您想在-Depth Monitoring中监视?手表有一个深度API来解决此问题。
深:它代表了深度监控。它有两个值。是或错误,它不仅监视数组中对象的变化,还监视对象的属性更改。
为了解决第二种问题,您可以使用剪接:
VM。$ forceupdate()
示例:强制VUE实例重命名。注意它仅影响实例本身的子组件并插入插槽内容,而不是所有子类别。(说话只是为了更新自己的组件,您不会更新sub -component)
参考文章:一篇文章了解对象。DefinePropertyand Proxy,vue3.0为什么要使用代理?
vue无法通过竞标听到数组的修改,并且与object无关。
原来的;https://juejin.cn/post/7103764386220769311