vueweb端响应式布局_vue响应式原理图文详解「建议收藏」

vueweb端响应式布局_vue响应式原理图文详解「建议收藏」Vue最显著的特性之一便是不太引人注意的响应式系统(reactivitysystem)。模型层(model)只是普通JS对象,修改它则更新视图(view)。这会让状态管理变得非常简单且直观,不过理解它的工作原理以避免一些常见的问题也是很重要的。本文将详细介绍Vue响应式系统的底层细节。追踪变化把一个普通JS对象传给Vue实例的data选项,Vue将遍历此对象所有的属性,并使用Object.def…

大家好,又见面了,我是你们的朋友全栈君。

Vue最显著的特性之一便是不太引人注意的响应式系统(reactivity system)。模型层(model)只是普通JS对象,修改它则更新视图(view)。这会让状态管理变得非常简单且直观,不过理解它的工作原理以避免一些常见的问题也是很重要的。

vueweb端响应式布局_vue响应式原理图文详解「建议收藏」

本文将详细介绍Vue响应式系统的底层细节。

追踪变化

把一个普通JS对象传给Vue实例的data选项,Vue将遍历此对象所有的属性,并使用Object.defineProperty把这些属性全部转为getter/setter。

Object.defineProperty是仅ES5支持,且无法shim的特性,这也就是为什么Vue不支持IE8浏览器的原因。

用户看不到getter/setter,但是在内部它们让Vue追踪依赖,在属性被访问和修改时通知变化

每个组件实例都有相应的watcher实例对象,它会在组件渲染的过程中把属性记录为依赖,之后当依赖项的setter被调用时,会通知watcher重新计算,从而致使它关联的组件得以更新。

vueweb端响应式布局_vue响应式原理图文详解「建议收藏」

变化检测

受现代JS的限制(以及废弃 Object.observe),Vue不能检测到对象属性的添加或删除。由于Vue会在初始化实例时对属性执行 getter/setter转化过程,所以属性必须在data对象上存在才能让Vue转换它,这样才能让它是响应的。var vm = new Vue({

data:{

a:1

}

})

// `vm.a` 是响应的

vm.b = 2

// `vm.b` 是非响应的

Vue不允许在已经创建的实例上动态添加新的根级响应式属性(root-level reactive property)。然而它可以使用 Vue.set(object, key, value) 方法将响应属性添加到嵌套的对象上。Vue.set(vm.someObject, ‘b’, 2)

也可以使用 vm.$set 实例方法,这也是全局 Vue.set 方法的别名。this.$set(this.someObject,’b’,2)

有时想向已有对象上添加一些属性,例如使用Object.assign()或 _.extend()方法来添加属性。但是,添加到对象上的新属性不会触发更新。在这种情况下可以创建一个新的对象,让它包含原对象的属性和新的属性。// 代替 `Object.assign(this.someObject, { a: 1, b: 2 })`

this.someObject = Object.assign({}, this.someObject, { a: 1, b: 2 })

声明响应式属性

由于Vue不允许动态添加根级响应式属性,所以必须在初始化实例前声明根级响应式属性,哪怕只是一个空值。var vm = new Vue({

data: {

// 声明 message 为一个空值字符串

message: ”

},

template: ‘

{
{ message }}

})

// 之后设置 `message`

vm.message = ‘Hello!’

如果在data选项中未声明 message,Vue将警告渲染函数在试图访问的属性不存在。

这样的限制在背后是有其技术原因的,它消除了在依赖项跟踪系统中的一类边界情况,也使Vue实例在类型检查系统的帮助下运行的更高效。

而且在代码可维护性方面也有一点重要的考虑:data 对象就像组件状态的概要,提前声明所有的响应式属性,可以让组件代码在以后重新阅读或其他开发人员阅读时更易于被理解。

异步更新队列

Vue异步执行DOM更新。只要观察到数据变化,Vue将开启一个队列,并缓冲在同一事件循环中发生的所有数据改变。如果同一个watcher被多次触发,只会一次推入到队列中。

这种在缓冲时去除重复数据对于避免不必要的计算和DOM操作上非常重要。然后,在下一个的事件循环“tick”中,Vue刷新队列并执行实际(已去重的)工作。

Vue在内部尝试对异步队列使用原生的Promise.then和MutationObserver,如果执行环境不支持,会采用setTimeout(fn, 0)代替

例如,当设置vm.someData=’new value’,该组件不会立即重新渲染。当刷新队列时,组件会在事件循环队列清空时的下一个“tick”更新。多数情况不需要关心这个过程,但是如果想在DOM状态更新后做点什么,这就可能会有些棘手。

虽然Vue.js通常鼓励开发人员沿着“数据驱动”的方式思考,避免直接接触 DOM,但是有时确实要这么做。为了在数据变化之后等待Vue完成更新DOM ,可以在数据变化之后立即使用Vue.nextTick(callback) 。这样回调函数在DOM更新完成后就会调用。

{
{message}}

var vm = new Vue({

el: ‘#example’,

data: {

message: ‘123’

}

})

vm.message = ‘new message’ // 更改数据

vm.$el.textContent === ‘new message’ // false

Vue.nextTick(function () {

vm.$el.textContent === ‘new message’ // true

})

在组件内使用vm.$nextTick()实例方法特别方便,因为它不需要全局Vue,并且回调函数中的this将自动绑定到当前的Vue实例上:Vue.component(‘example’, {

template: ‘{
{ message }}’,

data: function () {

return {

message: ‘没有更新’

}

},

methods: {

updateMessage: function () {

this.message = ‘更新完成’

console.log(this.$el.textContent) // => ‘没有更新’

this.$nextTick(function () {

console.log(this.$el.textContent) // => ‘更新完成’

})

}

}

})

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/138926.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • OpenGL的glPushMatrix()和glPopMatrix()矩阵栈顶操作函数详解「建议收藏」

    OpenGL中图形绘制后,往往需要一系列的变换来达到用户的目的,而这种变换实现的原理是又通过矩阵进行操作的。opengl中的变换一般包括视图变换、模型变换、投影变换等,在每次变换后,opengl将会呈现一种新的状态(这也就是我们为什么会成其为状态机)。    有时候在经过一些变换后我们想回到原来的状态,就像我们谈恋爱一样,换来换去还是感觉初恋好,怎么办?强大的opengl就帮我们提

    2022年4月7日
    113
  • 基于51单片机的红绿灯设计

    基于51单片机的红绿灯设计寒假项目最后一个,基于STC/AT89C51的红路灯设计实现十效果具体为:南北通行42秒,南北闪烁3秒,南北黄灯4秒,禁止通行1秒,东西黄灯4秒,东西通行27秒,东西闪烁3秒,东西黄灯4秒。同时具备特殊放行模式:南北自由通行;东西自由通行;全部禁行。所有时间可以修改。貌似和平时的红路灯不一样,但是由于想凑齐八个状态,就整了这神奇的控制步骤。黄灯多,安全第一!!原理图:本来是想设计一个蓝牙或者……

    2025年5月24日
    0
  • spss实现单因素方差分析怎么做_双因素方差分析例题

    spss实现单因素方差分析怎么做_双因素方差分析例题总目录:SPSS学习整理SPSS实现单因素方差分析目的适用情景数据处理SPSS操作SPSS输出结果分析知识点目的检验单因素水平下的一个或多个独立因变量均值是否存在显著性差异,即检验单因素各个水平的均值是否来自同一个总体。(因变量为连续变量)适用情景方差分析前提:各个总体服从正态分布各个总体方差相等观测值独立数据处理SPSS操作SPSS输出结果分析基本信息基于平均值显著性为0.729,大于0.05,认为各组总体方差相等F=8.744,显著性为0.007,小于0.

    2022年10月19日
    0
  • RPN网络讲解

    RPN网络讲解讲完了anchor机制,接下来我们讲RPN(regionproposalnetwork)区域候选网络。_build_network:https://github.com/endernewton/tf-faster-rcnn/blob/master/lib/nets/network.py原理解释FeatureMap进入RPN后,先经过一次33的卷积,同样,特征图大小依然是6040,数量…

    2022年6月23日
    40
  • 转 -如何改变*.sln文件的路径「建议收藏」

    转 -如何改变*.sln文件的路径「建议收藏」工具-》选项—》项目和解决方案,可以设置项目和解决方案的目录。选中解决方案,点击文件,可以出现,*.sln另存为的选项转载于:https://www.cnblogs.com/9421/archive/2010/02/01/1660764.html…

    2022年5月18日
    74
  • Servlet的工作原理简介

    Servlet的工作原理简介你使用的本地web服务器或者买的别的服务器都一样的原理,鼠标点击事件发出一个HTTP请求以后,服务器会将请求移交给servlet容器,servlet容器首先对所请求的URL进行解析并根据web.xml配置文件找到相应的处理servlet,同时将request、response对象传递给它,servlet通过request对象可知客户端的请求者、请求信息以及其他的信息等,servlet在处理完请求后…

    2022年9月1日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号