• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答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)前位置: 首頁 - 科技 - 知識(shí)百科 - 正文

    淺談Vue數(shù)據(jù)綁定的原理

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

    淺談Vue數(shù)據(jù)綁定的原理

    淺談Vue數(shù)據(jù)綁定的原理:本文介紹了Vue數(shù)據(jù)綁定的原理,分享給大家,具體如下: 原理 其實(shí)原理很簡單,就是攔截了Object的get/set方法,在對(duì)數(shù)據(jù)進(jìn)行set (obj.aget=18) 時(shí)去重現(xiàn)渲染視圖 實(shí)現(xiàn)方式有兩種 方式1 定義了同名的get/set就相當(dāng)于定義了age var test = {
    推薦度:
    導(dǎo)讀淺談Vue數(shù)據(jù)綁定的原理:本文介紹了Vue數(shù)據(jù)綁定的原理,分享給大家,具體如下: 原理 其實(shí)原理很簡單,就是攔截了Object的get/set方法,在對(duì)數(shù)據(jù)進(jìn)行set (obj.aget=18) 時(shí)去重現(xiàn)渲染視圖 實(shí)現(xiàn)方式有兩種 方式1 定義了同名的get/set就相當(dāng)于定義了age var test = {

    本文介紹了Vue數(shù)據(jù)綁定的原理,分享給大家,具體如下:

    原理

    其實(shí)原理很簡單,就是攔截了Object的get/set方法,在對(duì)數(shù)據(jù)進(jìn)行set (obj.aget=18) 時(shí)去重現(xiàn)渲染視圖

    實(shí)現(xiàn)方式有兩種

    方式1

    定義了同名的get/set就相當(dāng)于定義了age

    var test = {
     _age: 18,
     get age() {
     console.log('觸發(fā)get');
     //直接會(huì)this.age會(huì)進(jìn)入死遞歸的
     return this._age;
     },
     set age(age) {
     console.log('觸發(fā)set');
     this._age = age;
     }
     };
    

    為了讓test不顯示多余的變量,可以把_age定義在外部

    var _age = 18;
     var test = {
     get age() {
     console.log('觸發(fā)get');
     //直接會(huì)this.age會(huì)進(jìn)入死遞歸的
     return _age;
     },
     set age(age) {
     console.log('觸發(fā)set');
     _age = age;
     }
     };
    

    方式2

    使用這種方式完美的解決了對(duì)象內(nèi)包含多余的變量的問題

    function test() {
     var _age = 18;
     Object.defineProperty(this, "age", {
     get: function () {
     console.log('觸發(fā)get');
     return _age;
     },
     set: function (value) {
     console.log('觸發(fā)set')
     _age = value;
     }
     });
     }
     var t = new test();
     t.age=18;
    

    實(shí)現(xiàn)數(shù)據(jù)到視圖的綁定

    這里的渲染只是一個(gè)簡單的正則替換

    要實(shí)現(xiàn)Vue那么強(qiáng)大的功能還要自己實(shí)現(xiàn)一個(gè)模板引擎

     

    <div id="test">
     <p>name:</p>
     <p>age:</p>
    </div>
    function Element(id, initData) {
     var self = this;
     var el = document.getElementById(id);
     var templet = el.innerHTML;
     var _data = null;
    
     if (initData) {
     _data = {};
     for (var variable in initData) {
     _data[variable] = initData[variable];
     bind(variable, self);
     }
     }
    
     function bind(variable, obj) {
     Object.defineProperty(self, variable, {
     set: function (value) {
     //使用_data里的數(shù)據(jù),避免死遞歸
     _data[variable] = value;
     //每次被設(shè)置新值的時(shí)候重新渲染界面
     render();
     },
     get: function () {
     return _data[variable];
     },
     });
     }
    
     //渲染
     function render() {
     var temp = templet;
     temp = temp.replace(/\{\{(.*)\}\}/g, function (s, t) {
     if (_data[t]) {
     return _data[t];
     }
     });
     el.innerHTML = temp;
     }
    
     //初始化時(shí)候手動(dòng)渲染一次
     render();
    }
    
    var app = new Element('test', {
     name: 'zhangsan',
     age: 18
    })
    

    實(shí)現(xiàn)視圖到數(shù)據(jù)的綁定

    這里做一個(gè)簡單的input改變的事件監(jiān)聽

    每次渲染之后都要重新添加事件,用時(shí)間委托可以實(shí)現(xiàn),但是input的focus位置不能保留

    可見Vue內(nèi)部的渲染和事件綁定肯定不是像這里demo寫的那么簡單,這里只是大致的原理(可能并不是這樣的。。)

     

    <div id="test">
     <input type="text" value="">
     <br>
     <span></span>
    </div>
    function Element(id, initData) {
     var self = this;
     var el = document.getElementById(id);
     var templet = el.innerHTML;
     var input = el.getElementsByTagName('input')[0];
     var _data = initData;
    
     Object.defineProperty(self, 'data', {
     set: function (value) {
     _data = value;
     render();
     },
     get: function () {
     return _data;
     },
     });
    
     //渲染
     function render() {
     var temp = templet;
     temp = temp.replace(/\{\{(data)\}\}/g, function (s, t) {
     return _data;
     });
     el.innerHTML = temp;
    
     //重新添加事件,其實(shí)應(yīng)該用事件委托的
     input = el.getElementsByTagName('input')[0];
     inputchange();
     input.focus();
     }
    
     function inputchange() {
     if (window.attachEvent) {
     input.attachEvent("oninput", temp);
     } else if (window.addEventListener) {
     input.addEventListener("input", temp, false);
     }
    
     function temp() {
     self.data = input.value;
     }
     }
    
     //初始化時(shí)候手動(dòng)渲染一次
     render();
    }
    var app = new Element('test', '');
    
    

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

    文檔

    淺談Vue數(shù)據(jù)綁定的原理

    淺談Vue數(shù)據(jù)綁定的原理:本文介紹了Vue數(shù)據(jù)綁定的原理,分享給大家,具體如下: 原理 其實(shí)原理很簡單,就是攔截了Object的get/set方法,在對(duì)數(shù)據(jù)進(jìn)行set (obj.aget=18) 時(shí)去重現(xiàn)渲染視圖 實(shí)現(xiàn)方式有兩種 方式1 定義了同名的get/set就相當(dāng)于定義了age var test = {
    推薦度:
    標(biāo)簽: 綁定 數(shù)據(jù) 原理
    • 熱門焦點(diǎn)

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 中文字幕精品一区二区精品| heyzo高无码国产精品| 欧美jizzhd精品欧美| 51精品资源视频在线播放| 日韩精品无码专区免费播放| 国产精品国产三级在线高清观看| 国产精品免费一区二区三区四区| 久久久久久久亚洲精品| 亚洲国产精品久久久久婷婷软件| 国产精品无码一区二区三级| 伊人久久精品无码av一区| 国产精品无打码在线播放| 国内精品免费在线观看 | 久久久精品久久久久特色影视| 欧美成人精品一级高清片| 精品熟女少妇a∨免费久久| 亚洲精品无码av天堂| 久久99精品免费一区二区| jizz国产精品| 777国产盗摄偷窥精品0OOO| 九九精品在线观看| 精品在线免费观看| 久久亚洲国产欧洲精品一 | 国产亚洲欧美精品永久| 中文字幕一精品亚洲无线一区| 久久久精品人妻无码专区不卡| 精品久久久无码中文字幕| 国产精品乱伦| 国产精品成人h片在线| 午夜精品美女写真福利| 久久成人精品视频| 免费欧美精品a在线| 亚洲自偷自偷精品| 国产精品爱搞视频网站| 国产亚洲精品资在线| 久久精品亚洲男人的天堂| 久久精品国产黑森林| 日韩精品欧美亚洲| 天天爽夜夜爽夜夜爽精品视频| 无码人妻精品一区二| 亚洲精品国产va在线观看蜜芽|