作家
登录

关于Vue.js的响应式原理

作者: 来源: 2017-08-31 10:38:16 阅读 我要评论

Vue.js响应式道理

写在前面

文┞仿的原地址:https://github.com/answershuto/learnVue。

在进修过程中,为Vue加上了中文的注释https://github.com/answershuto/learnVue/tree/master/vue-src,欲望可以对其他想进修Vue源码的小伙伴有所赞助。

关于Vue.js

Vue.js是一款MVVM框架,上手快速简单易用,经由过程响应式在修改数据的时刻更新视图。Vue.js的响应式道理依附于Object.defineProperty,尤大年夜大年夜在Vue.js文档中就已经提到过,这也是Vue.js不支撑E8 以及更低版本浏览器的原因。Vue经由过程设定对象属性的 setter/getter 办法来监听数据的变更,经由过程getter进行依附收集,而每个setter办法就是一个不雅察者,在数据变革的时刻通知订阅┞愤更新视图。

将数据data变成可不雅察(observable)的

那么Vue是若何将所有data下面的所有属性变成可不雅察的(observable)呢?

为了便于懂得,起首推敲一种最简单的情况,不推敲数组等情况,代码如上所示。在initData中会调用observe这个函数将Vue的数据设置成observable的。当_data数据产生改变的时刻就会触发set,对订阅┞愤进行回调(在这里是render)。

那么问题来了,须要对app._date.text操作才会触发set。为恋氐懒,我们须要一种便利的办法经由过程app.text直接设置就能触发set对视图进行重绘。那么就须要用到代劳。

代劳

可能会有懂得存在误差的处所,迎接提issue指出,合营进修,合营进步。

我们可以在Vue的构造函数constructor中为data履行一个代劳proxy。如许我们就把data膳绫擎的属性代劳到了vm实例上。

  1. _proxy(options.data);/*构造函数中*/ 
  2.  
  3. /*代劳*/ 
  4. function _proxy (data) { 
  5.     const that = this; 
  6.     Object.keys(data).forEach(key => { 
  7.         Object.defineProperty(that, key, { 
  8.             configurable: true
  9.             enumerable: true
  10.             get: function proxyGetter () { 
  11.                 return that._data[key]; 
  12.             }, 
  13.             setfunction proxySetter (val) { 
  14.                 that._data[key] = val; 
  15.             } 
  16.         }) 
  17.     }); 
  18.  
  1. function observer(value) { 
  2.     Object.keys(value).forEach((key) => defineReactive(value, key, value[key] , cb)) 
  3.  
  4. function defineReactive (obj, key, val, cb) { 
  5.     Object.defineProperty(obj, key, { 
  6.         enumerable: true

      推荐阅读

      关于刷屏的“小朋友画廊” 你想知道的东西都在这

    一个名叫“小同伙画廊”的H5在很多人的同伙圈悄然传播开来。这个H5展示了36幅画作,用户点开H5可以购买本身爱好的画作,获得电子版。值得留意的是,36幅画作均由患有自闭症的特>>>详细阅读


    本文标题:关于Vue.js的响应式原理

    地址:http://www.17bianji.com/lsqh/37034.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)