<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題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關(guān)鍵字專題關(guān)鍵字專題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
        當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

        代碼詳解Vuejs響應(yīng)式原理

        來源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 22:23:21
        文檔

        代碼詳解Vuejs響應(yīng)式原理

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

        響應(yīng)式原理

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

        Object.defineProperty

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

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

        數(shù)據(jù)屬性 > 數(shù)據(jù)屬性的descriptor包含四種:value、writable、enumerable、configurable

        var person = {
         name: 'json',
         age: 18
        }
        
        Object.defineProperty(person, 'name', {
         value: 'John', // 屬性的值,默認(rèn)為undefined
         writable: false, // 是否可以重寫屬性的值,設(shè)為false便是只讀的
         enumerable: false, // 是否可枚舉(for in或Object.keys),默認(rèn)為false
         configurable: true // 是否可以刪除或者重新設(shè)定上述配置,默認(rèn)為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劫持?jǐn)?shù)據(jù)的做法

        function observer(value, cb) {
         // 遍歷對(duì)象的所有屬性并為對(duì)象添加對(duì)應(yīng)的訪問器屬性
         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();/*訂閱者收到消息的回調(diào),這里為render函數(shù),即重新渲染*/
         }
         })
        }
        class Vue {
         constructor(options) {
         this._data = options.data;
         observer(this._data, options.render) /*把所有數(shù)據(jù)變成可觀察的*/
         }
        }
        let app = new Vue({
         el: '#app',
         data: {
         text: 'text',
         text2: 'text2'
         },
         render(){
         console.log("render");
         }
        })

        殘留問題 > 上述實(shí)現(xiàn)只有通過app._data_text才會(huì)觸發(fā)set,那么怎樣才能做到app.text就能觸發(fā)set呢
        代理

        > 通過在this對(duì)象中添加訪問器屬性即可實(shí)現(xiàn)代理,然后就可以用app.text來代替app._data.text了

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

        聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        代碼詳解Vuejs響應(yīng)式原理

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

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 成人亚洲国产va天堂| 亚洲国产av美女网站| 免费国产黄网站在线观看动图 | 国产午夜无码视频免费网站| 美女视频黄.免费网址| 女人18毛片水真多免费播放 | 亚洲AV成人一区二区三区在线看| 91大神在线免费观看| 亚洲日本在线观看网址| 欧洲一级毛片免费| 亚洲首页国产精品丝袜| 大学生美女毛片免费视频| 亚洲av永久无码精品网址| 国产在线不卡免费播放| 特黄特色大片免费| 亚洲色婷婷六月亚洲婷婷6月| 两个人看的www免费视频中文| 亚洲国产精品第一区二区| 毛片免费全部播放无码 | 日亚毛片免费乱码不卡一区| 亚洲色图综合在线| 成人电影在线免费观看| 精品日韩亚洲AV无码| 我要看免费的毛片| 无遮挡免费一区二区三区| 亚洲欧洲国产精品香蕉网| 1000部禁片黄的免费看| 国产精品亚洲а∨天堂2021| 中文字幕亚洲第一| 台湾一级毛片永久免费| 国产大陆亚洲精品国产| 亚洲狠狠久久综合一区77777| 成人免费无码大片A毛片抽搐色欲| 美女裸体无遮挡免费视频网站| 亚洲熟妇av一区二区三区| 亚洲毛片免费观看| 国产亚洲视频在线| 亚洲黑人嫩小videos| www.亚洲一区| 免费在线观看h片| 一级午夜免费视频|