博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
深入响应式原理——vue.js
阅读量:6604 次
发布时间:2019-06-24

本文共 1256 字,大约阅读时间需要 4 分钟。

  非侵入性的响应式系统是Vue最独特的特性之一。 那么非侵入性的响应式系统是什么呢? 

  Vue是mvvm框架。而module仅仅只是普通的JavaScript对象。当你修改这些对象时,视图也会进行更新。这就是非侵入性的响应式。 

  那么响应式底层原理是什么呢?

  简单说:当你把一个普通的JavaScript对象传入Vue实例作为data时,Vue将会遍历这个对象的所有属性。在遍历时会使把这些属性全部转为getter或者setter。由于Object.defineProperty是ES5中一个无法shim的特性,因此Vue不支持IE8以及更低版本的浏览器。

  当然getter/setter对用户是不可见的,但是Vue能够在内部通过它们追踪依赖。所以当属性被读写时,Vue也能及时的变更属性。

  那么Vue是如何在内部追踪依赖呢?

  其实每个组件实例都对应一个watcher实例,它会在组件渲染的过程中把监听到的数据属性记录为依赖。之后当该依赖的setter被触发时,会反馈给watcher,使该依赖和相关联的组件重新渲染。

 

  以下是图解:

 

    当属性检测时,应当注意如下几项:

    一、由于Object.observe 被废弃,Vue无法检测到对象属性的添加或删除操作。但是Vue会在初始化实例 对象时执行getter/setter转化。也因此属性必须写在data对象上,只有如此Vue才会将该属性传唤成响应式。

    二、对于已经创建的实例,Vue是 不允许动态添加根级别的响应式属性。但是,可以使用 Vue.set(object, propertyName, value) 方法向嵌套对象添加响应式属性。例如,

Vue.set(vm.someObject, 'b', 2)

还可以使用 vm.$set 实例方法,这也是全局 Vue.set 方法的别名:

this.$set(this.someObject,'b',2)

有时你可能需要为已有对象赋值多个新属性,比如使用 Object.assign() 或 _.extend()。但是,这样添加到对象上的新属性不会触发更新。在这种情况下,你应该用原对象与要混合进去的对象的属性一起创建一个新的对象。

由于 Vue 不允许动态添加根级响应式属性,所以你必须在初始化实例前声明所有根级响应式属性,哪怕只是一个空值:

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

这样的限制在背后是有其技术原因的,它消除了在依赖项跟踪系统中的一类边界情况,也使 Vue 实例能更好地配合类型检查系统工作。但与此同时在代码可维护性方面也有一点重要的考虑:data 对象就像组件状态的结构 (schema)。

提前声明所有的响应式属性,可以让组件代码在未来维护时,给其他开发人员阅读时更易于理解。

 

转载于:https://www.cnblogs.com/rkpbk/p/10930184.html

你可能感兴趣的文章
Email - Boss's concerns
查看>>
余世维 - 有效沟通
查看>>
mysql用户与权限管理笔记
查看>>
a里面不能嵌套a
查看>>
Myeclipse中打开接口实现类的快捷键
查看>>
浅谈React数据流管理
查看>>
<20190516> 一次比较糟糕的售后维修体验(某硕主板)
查看>>
iOS网络篇2-http协议通信规则
查看>>
删除sql dump中的AUTO_INCREMENT
查看>>
使用JdbcTemplate和JdbcDaoSupport
查看>>
Ruby-GNOME2 1.2.0 发布,支持 GTK+ 3
查看>>
C博客作业--指针
查看>>
版本12.2.0.1.0数据库,复制种子数据库快速创建租户数据库PDB
查看>>
吴忠军中华演出网
查看>>
Page翻页分页css代码,分页div+css代码
查看>>
编程之美 第1章 游戏之乐——游戏中碰到的题目(十一)
查看>>
mysql for Mac 下创建数据表中文显示为?的解决方法
查看>>
Qt中插入html样式
查看>>
【译】Matplotlib:plotting
查看>>
Postgresql个人维护库时,出现有用户在连接又找不到这个用户是谁的强制中断连接的方法;...
查看>>