js實現一個簡單的響應式雙向數據綁定


一,基本原理  

  我們這里使用了對象中的一個特殊屬性:訪問器屬性,這個屬性不能在對象中設置,而是必須通過defineProperty()方法單獨定義。

  我們首先定義一個函數:

    var obj = { };

  其次,為obj對象定義一個test的訪問器屬性:

    Object.defineProperty(obj, 'test', {

        get: ()=>{console.log('get被調用了')},

        set: ()=>{console.log('set被調用了')}

    })

  可以像普通屬性一樣讀取訪問器屬性,但是當讀取或設置訪問器屬性的時候,調用其內部特性:get和set函數。get和set方法內部的this都指向obj,這意味着get和set可以操作對象內部的值。另外訪問器屬性會被優先調用,與其同名的普通屬性則會被忽略。

  obj.test //讀取屬性,調用get函數

  obj.test = 'abcd' //為屬性賦值,調用set函數

二,舉個栗子

  我們要的效果是:隨着輸入框文字的變化,span中會同步顯示相同的文字內容;或者在js或控制台修改obj.test的值,視圖也會更新,這樣就實現了model到view以及view到model的雙向數據綁定。

  首先有一個input和span。

<input type="text" id="input_1">
<span id="span_1"></span>

var obj = {};
Object.defineProperty(obj, 'test', {
  set: (newVal)=>{
    document.getElementById('input_1').value = newVal;
    document.getElementById('span_1').innerHTML = newVal;
  }
});
document.addEventListener('keyup', (e)=>{
  obj.test = e.target.value;
})

  效果圖:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM