当前位置: 首页 > 网络应用技术

VUE2 -OOCT.DEFINE PROPRTY的响应原理简介

时间:2023-03-08 20:59:58 网络应用技术

  大家好,我是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