成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

關(guān)于Vue.js的響應(yīng)式原理

開發(fā) 前端
Vue.js是一款MVVM框架,上手快速簡單易用,通過響應(yīng)式在修改數(shù)據(jù)的時(shí)候更新視圖。Vue.js的響應(yīng)式原理依賴于Object.defineProperty,尤大大在Vue.js文檔中就已經(jīng)提到過,這也是Vue.js不支持E8 以及更低版本瀏覽器的原因。

Vue.js響應(yīng)式原理

寫在前面

因?yàn)閷?duì)Vue.js很感興趣,而且平時(shí)工作的技術(shù)棧也是Vue.js,這幾個(gè)月花了些時(shí)間研究學(xué)習(xí)了一下Vue.js源碼,并做了總結(jié)與輸出。

文章的原地址:https://github.com/answershuto/learnVue

在學(xué)習(xí)過程中,為Vue加上了中文的注釋https://github.com/answershuto/learnVue/tree/master/vue-src,希望可以對(duì)其他想學(xué)習(xí)Vue源碼的小伙伴有所幫助。

可能會(huì)有理解存在偏差的地方,歡迎提issue指出,共同學(xué)習(xí),共同進(jìn)步。

關(guān)于Vue.js

Vue.js是一款MVVM框架,上手快速簡單易用,通過響應(yīng)式在修改數(shù)據(jù)的時(shí)候更新視圖。Vue.js的響應(yīng)式原理依賴于Object.defineProperty,尤大大在Vue.js文檔中就已經(jīng)提到過,這也是Vue.js不支持E8 以及更低版本瀏覽器的原因。Vue通過設(shè)定對(duì)象屬性的 setter/getter 方法來監(jiān)聽數(shù)據(jù)的變化,通過getter進(jìn)行依賴收集,而每個(gè)setter方法就是一個(gè)觀察者,在數(shù)據(jù)變更的時(shí)候通知訂閱者更新視圖。

將數(shù)據(jù)data變成可觀察(observable)的

那么Vue是如何將所有data下面的所有屬性變成可觀察的(observable)呢?

  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
  7.         configurable: true
  8.         get: ()=>{ 
  9.             /*....依賴收集等....*/ 
  10.         }, 
  11.         set:newVal=> { 
  12.             cb();/*訂閱者收到消息的回調(diào)*/ 
  13.         } 
  14.     }) 
  15.  
  16. class Vue { 
  17.     constructor(options) { 
  18.         this._data = options.data; 
  19.         observer(this._data, options.render) 
  20.     } 
  21.  
  22. let app = new Vue({ 
  23.     el: '#app'
  24.     data: { 
  25.         text: 'text'
  26.         text2: 'text2' 
  27.     }, 
  28.     render(){ 
  29.         console.log("render"); 
  30.     } 
  31. })  

為了便于理解,首先考慮一種最簡單的情況,不考慮數(shù)組等情況,代碼如上所示。在initData中會(huì)調(diào)用observe這個(gè)函數(shù)將Vue的數(shù)據(jù)設(shè)置成observable的。當(dāng)_data數(shù)據(jù)發(fā)生改變的時(shí)候就會(huì)觸發(fā)set,對(duì)訂閱者進(jìn)行回調(diào)(在這里是render)。

那么問題來了,需要對(duì)app._date.text操作才會(huì)觸發(fā)set。為了偷懶,我們需要一種方便的方法通過app.text直接設(shè)置就能觸發(fā)set對(duì)視圖進(jìn)行重繪。那么就需要用到代理。

代理

我們可以在Vue的構(gòu)造函數(shù)constructor中為data執(zhí)行一個(gè)代理proxy。這樣我們就把data上面的屬性代理到了vm實(shí)例上。

  1. _proxy(options.data);/*構(gòu)造函數(shù)中*/ 
  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.  

我們就可以用app.text代替app._data.text了。 

責(zé)任編輯:龐桂玉 來源: 染陌同學(xué)的博客
相關(guān)推薦

2021-01-22 11:47:27

Vue.js響應(yīng)式代碼

2021-04-14 12:47:50

Vue.jsMJML電子郵件

2022-04-17 09:18:11

響應(yīng)式數(shù)據(jù)Vue.js

2022-04-16 13:59:34

Vue.jsJavascript

2020-06-09 11:35:30

Vue 3響應(yīng)式前端

2019-07-01 13:34:22

vue系統(tǒng)數(shù)據(jù)

2022-04-25 07:36:21

組件數(shù)據(jù)函數(shù)

2013-02-21 09:54:12

響應(yīng)式重構(gòu)Web

2016-11-04 19:58:39

vue.js

2017-07-04 17:55:37

Vue.js插件開發(fā)

2018-04-04 10:32:13

前端JavascriptVue.js

2023-06-02 16:28:01

2022-05-03 21:18:38

Vue.js組件KeepAlive

2020-09-16 06:12:30

Vue.js 3.0Suspense組件前端

2022-04-05 16:44:59

系統(tǒng)Vue.js響應(yīng)式

2018-07-10 15:35:33

Vue前端架構(gòu)

2021-09-27 06:29:47

Vue3 響應(yīng)式原理Vue應(yīng)用

2022-04-26 05:55:06

Vue.js異步組件

2024-09-02 16:10:19

vue2前端

2022-01-19 22:18:56

Vue.jsVue SPA開發(fā)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 欧美一级小视频 | 久久久久国产精品人 | 国产日韩91 | 免费黄篇| 四虎午夜剧场 | 91精品国产一区 | 欧美日韩不卡 | 欧美一区 | 久久高清精品 | 久久久久久久久淑女av国产精品 | 一区福利视频 | 人人人人爽 | 91中文字幕 | 精品国产欧美一区二区三区成人 | 日韩一级免费看 | www.国产日本 | 久色激情| 日本不卡一区二区三区 | 欧美日韩在线播放 | 在线观看黄色 | 天天操精品视频 | 国产一区二区在线播放 | av毛片免费 | 国产一区二区在线播放 | 怡红院免费的全部视频 | 羞羞视频免费观 | 中文字幕国产视频 | 国产精品视频网站 | 欧美一区二区三区在线观看 | 一区二区在线 | 国产精品久久久久无码av | 精品国产亚洲一区二区三区大结局 | 国产成人在线播放 | 91资源在线 | 日韩欧美国产精品一区二区三区 | 天堂网色 | 三级免费av | 一级视频在线免费观看 | 天天草草草| 日韩中文字幕一区二区 | 免费h视频 |