vue-數(shù)據(jù)雙向綁定

網(wǎng)上有很多關于數(shù)據(jù)的雙向綁定的介紹,但是感覺描述的太過于累贅。使閱讀者感覺太難理解幢妄。這里我將一步一步循循漸進的方式剧董。領導你們寫一個數(shù)據(jù)的雙向綁定的案例幢尚。 ——觀察者模式

數(shù)據(jù)單向綁定M——V或者V——M

數(shù)據(jù)單向綁定之數(shù)據(jù)驅(qū)動視圖即 M——V

<input id="test1">
</input>
<script>
let data = 2;
const oSpan = document.getElementById("test1");
oSpan.value = data;
// 這里改變數(shù)據(jù)通知視圖變化 
setInterval(() => {
    data += 1;
    oSpan.value = data;
}, 1000)
</script>

數(shù)據(jù)單向綁定之視圖驅(qū)動數(shù)據(jù)即 V——M

<input id="dom2"/>
</body>
<script>
let data;
const oDom = document.getElementById("dom2")
// 通過監(jiān)聽 dom變化通知數(shù)據(jù)改變
oDom.addEventListener("input", (ev) => {
    data = ev.target.value
    console.log(data)
})
</script>

從上面的案例我們得知要想數(shù)據(jù)改變;我們需要獲取變化翅楼,通知目標尉剩。
得到的思想:
1 需要一個觀察者:收集數(shù)據(jù)或者dom的變化
2 需要一個訂閱者:獲取改變并更新數(shù)據(jù)或者dom

數(shù)據(jù)之雙向綁定實現(xiàn) MVVM

根據(jù)上面我們得到的啟示來一步一步實現(xiàn)。
這里你需要了解一下:Object.defineProperty

數(shù)據(jù)雙綁定一 觀察者

案例只是單成對象毅臊,并沒有做for循環(huán)遍歷

<script>
const obj = {
    name: 'yx',
    age: 18
};

Object.defineProperty(obj, "name", {
    enumerable: true,
    configurable: true,
    get: function (val) {
        console.log("這里要添加訂閱者")
    },
    set: function (val) {
        console.log("這里要通知訂閱者")
    }
});
// 讀取數(shù)據(jù)的時候 我們要添加訂閱
setTimeout(() => {
    console.log(obj.name)
}, 1000)
// 改變數(shù)據(jù)的時候通知
setTimeout(() => {
    obj.name = "yxx"
}, 3000)
</script>

數(shù)據(jù)雙綁定二 訂閱者


// 訂閱者通過訂閱器添加
function Watcher() {
    setTimeout(() => {
       // 這里是為了觸發(fā)defineProperty 添加訂閱者
        this.get()
    }, 5000)
}
Watcher.prototype = {
    // dom更新
    update: function () {
        console.log("dom要更新")
    },
    // 促使添加訂閱者
    get: function () {
        Dep.target = this; // 這樣處理很方便添加訂閱者理茎,需自己體會
        const val = obj.name;
        console.log(`我要獲取${val}觸發(fā)添加訂閱者`)
    }
};

數(shù)據(jù)雙綁定三 訂閱器

把訂閱者和觀察者聯(lián)合起來

// 訂閱器
function Dep() {
    this.subs = []
}

Dep.prototype = {
   // 添加訂閱者
    addSub: function (sub) {
        this.subs.push(sub)
    },
 //  通知訂閱者
    notify: function () {
        this.subs.forEach(function (sub) {
            sub.update();
        });
    }
};

數(shù)據(jù)雙綁定實例 測試

<script>
const obj = {
   name: 'yx',
   age: 18
};

// 訂閱器  添加/通知 訂閱者
function Dep() {
   this.subs = []
}

Dep.prototype = {
   addSub: function (sub) {
       this.subs.push(sub)
   },
   notify: function () {
       this.subs.forEach(function (sub) {
           sub.update();
       });
   }
};

dep = new Dep();

function Observer(data, key) {
   Object.defineProperty(obj, "name", {
       enumerable: true,
       configurable: true,
       get: function (val) {
           console.log("這里要添加訂閱者");
           // dep.addSub(objW)
           dep.addSub(Dep.target)
       },
       set: function (val) {
           console.log("這里要通知訂閱者")
           dep.notify()
       }
   });
}

observer = new Observer(obj, "name");

function Watcher() {
   setTimeout(() => {
       this.get()
   }, 5000)
}

Watcher.prototype = {
   // dom更新
   update: function () {
       console.log("dom要更新")
   },
   // 促使添加訂閱者
   get: function () {
       Dep.target = this;
       const val = obj.name;
       console.log("我要獲取數(shù)據(jù)觸發(fā)添加訂閱者")
   }
};
new Watcher()


setTimeout(() => {
   obj.name = "yxxx"
}, 10000)
</script>

若要對多層對象監(jiān)聽則可以對對象實現(xiàn)for循環(huán)對每一個屬性進行監(jiān)聽

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市管嬉,隨后出現(xiàn)的幾起案子皂林,更是在濱河造成了極大的恐慌,老刑警劉巖蚯撩,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件础倍,死亡現(xiàn)場離奇詭異,居然都是意外死亡求厕,警方通過查閱死者的電腦和手機著隆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來呀癣,“玉大人美浦,你說我怎么就攤上這事∠罾福” “怎么了浦辨?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長沼沈。 經(jīng)常有香客問我流酬,道長,這世上最難降的妖魔是什么列另? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任芽腾,我火速辦了婚禮,結(jié)果婚禮上页衙,老公的妹妹穿的比我還像新娘摊滔。我一直安慰自己阴绢,他們只是感情好,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布艰躺。 她就那樣靜靜地躺著呻袭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪腺兴。 梳的紋絲不亂的頭發(fā)上左电,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天,我揣著相機與錄音页响,去河邊找鬼篓足。 笑死,一個胖子當著我的面吹牛拘泞,可吹牛的內(nèi)容都是我干的纷纫。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼陪腌,長吁一口氣:“原來是場噩夢啊……” “哼辱魁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起诗鸭,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤染簇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后强岸,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體锻弓,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年蝌箍,在試婚紗的時候發(fā)現(xiàn)自己被綠了青灼。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡妓盲,死狀恐怖杂拨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情悯衬,我是刑警寧澤弹沽,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站筋粗,受9級特大地震影響策橘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜娜亿,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一丽已、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧买决,春花似錦沛婴、人聲如沸辰斋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至够挂,卻和暖如春旁仿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背孽糖。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工枯冈, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人办悟。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓尘奏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親病蛉。 傳聞我的和親對象是個殘疾皇子炫加,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容