Vue的反应性系统是其有效更新DOM的能力的核心。它通过技术的组合来实现这一目标,主要是依赖性跟踪和变化通知。
依赖关系跟踪:创建组件时,VUE遍历其模板和数据属性。它使用称为“ Getter/Setter”截距的过程。本质上,VUE将数据属性转换为Getters和Setter。当模板访问数据属性(通过Getter)时,Vue秘密地记下了哪些模板零件(或计算属性)取决于该特定数据属性。这会创建一个依赖关系图,并将数据属性映射到使用它们的模板的各个部分。
更改通知:当数据属性修改(通过设置器)时,VUE不会盲目地重新渲染整个组件。相反,它仅重新呈现依赖修改属性的模板部分。它通过遍历初始设置期间创建的依赖关系图来实现这一目标。只有取决于更改数据的组件和模板零件才能更新,从而最大程度地减少了DOM操作的数量。
该系统在很大程度上依赖JavaScript的Proxy
API(用于较新的VUE版本)或Object.defineProperty
(用于较旧版本)。这些API允许VUE拦截属性访问和修改,从而实现依赖关系跟踪和更改通知机制。特定的实现细节可能会根据VUE版本而略有不同,但核心原理保持不变。该过程在根本上是有效的,因为它仅更新DOM的必要部分,与手动DOM操纵相比,导致性能的显着改善。
Vue的反应性系统通常非常有效,但是像任何系统一样,它具有在大型或复杂应用中可能会引人注目的性能含义。
积极的含义:
负面影响:
性能的影响很大程度上取决于应用程序的大小和复杂性。对于大多数应用,Vue的反应性系统提供了出色的性能。但是,优化策略对于更大,更复杂的项目至关重要。
优化VUE应用以提高反应性绩效涉及几种策略:
$nextTick
:如果您需要在数据更改后访问DOM,请使用$nextTick
确保在访问它之前已更新DOM。这可以防止种族条件。v-if
代替v-show
: v-if
完全从DOM中删除元素,而v-show
仅更改其CSS显示属性。如果有条件地渲染元素时,请使用v-if
。v-for
的key
道具可以通过识别单个项目并最大程度地减少DOM操作来有效地更新列表。input
事件),请使用辩论或节流降低更新的频率。是的,您可以使用$set
方法或Vue.set
手动触发Vue的反应性系统,以添加反应性属性, $forceUpdate
方法强制重新渲染或通过其通过其设定器直接修改反应性数据属性。
$set
or Vue.set
:使用this.$set(this.dataObject, 'propertyName', newValue)
或Vue.set(this.dataObject, 'propertyName', newValue)
将新属性添加到反应性对象或以反应性方式更新现有的属性。当将新属性添加到VUE已经观察到的对象中时,这一点尤其重要。直接分配新属性不会触发反应性。$forceUpdate
: $forceUpdate()
方法迫使组件重新渲染。很少使用此功能,因为它在计算上可能很昂贵。它主要在VUE反应性系统无法检测更改的边缘情况下,例如间接修改对象的属性时(例如,使用Object.assign
)。但是,请记住,应明智地使用手动触发反应性。过度使用可以否定VUE反应性系统的性能优势。内置机制通常足够且效率更高。应保留手动触发的特殊情况,如果自动反应性无法正常工作。
以上是Vue的反应性系统如何在引擎盖下工作?的详细内容。更多信息请关注PHP中文网其他相关文章!