• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當前位置: 首頁 - 科技 - 知識百科 - 正文

    代碼詳解Vuejs響應式原理

    來源:懂視網 責編:小采 時間:2020-11-27 22:23:21
    文檔

    代碼詳解Vuejs響應式原理

    代碼詳解Vuejs響應式原理:響應式原理 > vuejs中的模型(model)和視圖(view)是保持同步的,在修改數據的時候會自動更新視圖,這其實依賴于Object.defineProperty方法,所以vuejs不支持IE8及以下版本,vuejs通過劫持getter/setter方法來監聽數據的變化,通過getter進
    推薦度:
    導讀代碼詳解Vuejs響應式原理:響應式原理 > vuejs中的模型(model)和視圖(view)是保持同步的,在修改數據的時候會自動更新視圖,這其實依賴于Object.defineProperty方法,所以vuejs不支持IE8及以下版本,vuejs通過劫持getter/setter方法來監聽數據的變化,通過getter進

    響應式原理

    > vuejs中的模型(model)和視圖(view)是保持同步的,在修改數據的時候會自動更新視圖,這其實依賴于Object.defineProperty方法,所以vuejs不支持IE8及以下版本,vuejs通過劫持getter/setter方法來監聽數據的變化,通過getter進行依賴收集,在數據變更執行setter的時候通知視圖更新。

    Object.defineProperty

    > Object.defineProperty可以定義對象的屬性或修改對象的屬性
    > 目前可以通過 Object.defineProperty描述的屬性分為兩種:數據屬性和訪問器屬性

    // obj: 對象
    // prop: 對象中的屬性
    // descriptor: 對象中的屬性的特性
    Object.defineProperty(obj,prop,descriptor);

    數據屬性 > 數據屬性的descriptor包含四種:value、writable、enumerable、configurable

    var person = {
     name: 'json',
     age: 18
    }
    
    Object.defineProperty(person, 'name', {
     value: 'John', // 屬性的值,默認為undefined
     writable: false, // 是否可以重寫屬性的值,設為false便是只讀的
     enumerable: false, // 是否可枚舉(for in或Object.keys),默認為false
     configurable: true // 是否可以刪除或者重新設定上述配置,默認為false
    })
    
    person.name = 'new name';
    console.log(person.name); // 'John'
    
    for(key in person) console.log(person[key]); // 18
    
    Object.defineProperty(person, 'name', {
     writable: true, 
     enumerable: true, 
     configurable: false 
    })
    
    person.name = 'new name';
    console.log(person.name); // 'new name'
    
    for(key in person) console.log(person[key]); // 'new name',18

    訪問器屬性 > 訪問器屬性的desciptor包含四種:get、set、enumerable、configurable

    var person = { _age: 20 };
    
    Object.defineProperty(person, 'age',{
     get: function(){
     return this._age;
     },
     set: function(age){
     this._age = age < 0 ? 0 : age;
     }
    });
    
    person.age = 5; // _age == 5
    person.age = -3; // _age == 0
    person._age = -3; // _age == -3

    Vuejs劫持數據的做法

    function observer(value, cb) {
     // 遍歷對象的所有屬性并為對象添加對應的訪問器屬性
     Object.keys(value).forEach((key) => defineReactive(value, key, value[key] , cb))
    }
    function defineReactive (obj, key, val, cb) {
     Object.defineProperty(obj, key, {
     enumerable: true,
     configurable: true,
     get: ()=>{
     /*....依賴收集等....*/
     },
     set:newVal=> {
     cb();/*訂閱者收到消息的回調,這里為render函數,即重新渲染*/
     }
     })
    }
    class Vue {
     constructor(options) {
     this._data = options.data;
     observer(this._data, options.render) /*把所有數據變成可觀察的*/
     }
    }
    let app = new Vue({
     el: '#app',
     data: {
     text: 'text',
     text2: 'text2'
     },
     render(){
     console.log("render");
     }
    })

    殘留問題 > 上述實現只有通過app._data_text才會觸發set,那么怎樣才能做到app.text就能觸發set呢
    代理

    > 通過在this對象中添加訪問器屬性即可實現代理,然后就可以用app.text來代替app._data.text了

    _proxy(options.data);/*構造函數中*/
    
    /*代理*/
    function _proxy (data) {
     const that = this;
     Object.keys(data).forEach(key => {
     Object.defineProperty(that, key, {
     configurable: true,
     enumerable: true,
     get: function proxyGetter () {
     return that._data[key];
     },
     set: function proxySetter (val) {
     that._data[key] = val;
     }
     })
     });
    }

    聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    代碼詳解Vuejs響應式原理

    代碼詳解Vuejs響應式原理:響應式原理 > vuejs中的模型(model)和視圖(view)是保持同步的,在修改數據的時候會自動更新視圖,這其實依賴于Object.defineProperty方法,所以vuejs不支持IE8及以下版本,vuejs通過劫持getter/setter方法來監聽數據的變化,通過getter進
    推薦度:
    標簽: 原理 VUE js
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 国产精品爱搞视频网站 | 国产精品视频久久| 欧美精品www| 国产精品 日韩欧美| 国产精品一久久香蕉国产线看 | 北条麻妃国产九九九精品视频| 蜜国产精品jk白丝AV网站| 免费精品精品国产欧美在线欧美高清免费一级在线 | 欧美日韩精品系列一区二区三区| 国产精品第1页| 久久97精品久久久久久久不卡| 精品久久久噜噜噜久久久| 亚洲国产精品无码久久SM| 日韩在线精品一二三区| 精品第一国产综合精品蜜芽| 国产福利精品视频自拍 | 青草国产精品视频。| 精品国产成人在线| 国产精品内射久久久久欢欢| 日韩欧美精品不卡| 欧美精品免费线视频观看视频| 99久久99这里只有免费的精品| 国产综合精品女在线观看| 四虎国产精品永久免费网址| 尤物TV国产精品看片在线| 亚洲av无码国产精品色在线看不卡| 精品久久久久久无码中文野结衣| 国产精品区AV一区二区| 99久久免费国产精品热| 99久久久国产精品免费无卡顿| 国产麻豆一精品一AV一免费| 久久99精品久久只有精品| 精品深夜AV无码一区二区| 国产精品无码午夜福利| 精品人妻码一区二区三区| 国产l精品国产亚洲区在线观看| 国产精品免费看久久久| 99久久这里只有精品| 狠狠色丁香婷婷综合精品视频| 四虎精品免费永久在线| 亚洲国语精品自产拍在线观看|