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)
上一篇 2022年5月30日 下午4:46
下一篇 2022年5月30日 下午5:00


相关推荐

  • hive的基本数据类型有几种_hive浮点型数据类型

    hive的基本数据类型有几种_hive浮点型数据类型hive的基本数据类型1.基本数据类型hive类型      说明      java类型    实例  1).tinyint    1byte有符号的整数  byte      20  2).smalint   2byte有符号的整数 short     20  3).int     4byte有符号的整数  int      …

    2025年12月8日
    4
  • OpenCV学习笔记:resize函数改变图像的大小

    OpenCV提供了resize函数来改变图像的大小,函数原型如下:void resize(InputArray src,OutputArray dst,Size dsize,double fx=0,double fy=0,int interpolation=INTER_LINEAR );先解释一下各个参数的意思:src:输入,原图像,即待改变大小的图像

    2022年4月8日
    185
  • RESTful的详解

    RESTful的详解RESTful 也称为 REST 英文 Representati 即表现层状态传递 它是一种软件架构风格或设计风格 而不是一个标准

    2026年3月17日
    3
  • RC专题:积分电路理解

    RC专题:积分电路理解积分电路 微分电路我们对 Markdown 编辑器进行了一些功能拓展与语法支持 除了标准的 Markdown 编辑器功能 我们增加了如下几点新功能 帮助你用它写博客 全新的界面设计 将会带来全新的写作体验 在创作中心设置你喜爱的代码高亮样式 Markdown 将代码片显示选择的高亮样式进行展示 增加了图片拖拽功能 你可以将本地的图片直接拖拽到编辑区域直接展示 全新的 KaTeX 数学公式语法 增加了支持甘特图的 mermaid 语法 1 功能 增加了多屏幕编辑 Markdown 文章功能 增加了

    2025年10月16日
    7
  • Bootstrap Table API 中文版(完整翻译文档)

    Bootstrap Table API 中文版(完整翻译文档)Bootstraptab 中文文档 完整翻译文档 table bootstrapTab 看网上有中文版的 但有些就是字面直接译过来了 而且有的就没有翻译 那就打算自己再翻译一遍 每一条会尽 最大可能结合尽可能多资料翻译 如果发现译的内容比英文多 是添加了更详细的说明 表的名称 属性 类型

    2026年3月26日
    20
  • 深度学习100例-循环神经网络(RNN)实现股票预测 | 第9天

    深度学习100例-循环神经网络(RNN)实现股票预测 | 第9天文章目录一 前言二 RNN 是什么三 准备工作 1 设置 GPU2 加载数据四 数据预处理 1 归一化 2 设置测试集训练集五 构建模型六 激活模型七 训练模型八 结果可视化 1 绘制 loss 图 2 预测 3 评估一 前言今天是第 9 天 我们将开始 RNN 系列 完成股票开盘价格的预测 最后的 R2 可达到 0 72 CNN 系列后续我也会穿插更新我的环境 语言环境 Python3 6 5 编译器 jupyternoteb 深度学习环境 TensorFlow2 4 1 往期精彩内容 深度学习 100 例 卷积神经网络

    2026年3月26日
    2

发表回复

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

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