es6- Proxy 結合原生js/或jQuery實現vue的數據雙向綁定

點擊查看基礎Proxy認知

這篇我們集中如何使用js實現類似vue的簡單數據雙向綁定;

拿input和textarea兩個html標簽作為展示

show.gif

two-way data binding

一、html

<input type="text" id="inputName" />
<textarea name="haha" id="myArea" cols="30" rows="10">hello world</textarea>

二、js代碼

Proxy: target -- handler -- traps
//創建一個對象
 const myUser = {
     id:'inputName',
     name:''  //用來存儲和更新input的value值
 };
//第一步:當用戶改變input輸入值時更新myUser.name ,通過onchange事件處理程序來實現
inputChange(myUser);
function inputChange(myObject) {
    if (!myObject || !myObject.id) return;  //如果傳入的對象不存在或者沒有id屬性,return出去
    const input = document.getElementById(myObject.id); //通過對象里的id從而獲取對應id的input標簽
    input.addEventListener('onchange', function(e) {
        myObject.name = input.value;
    });
}
//第二步:在js代碼中修改myUse.name時,跟新input里的內容,這一步略微復雜,但是proxy代理提供了一個解決方案
    const inputHandler = {
     set:function (target,prop,newValue) {
         if(prop =='name' && target.id ) { //prop指的是傳入的對象里的屬性:
             //更新對象的屬性
            target[prop] = newValue;
            document.getElementById(target.id).value = newValue;
            return true;  //set方法返回值只有false或true;
         }
         else return false;
     }
    };
 //創建proxy
    const myUserProxy = new Proxy(myUser,inputHandler);

一、測試:

//手動設置一個新的名字:
    myUserProxy.name = 'Lily';
    console.log(myUserProxy.name);  //Lily
    console.log(document.getElementById('inputName').value);  //Lily

預覽:
靜態.png

二、方案1:原生js實現數據綁定

  • oninput事件可以監聽框的value變化
  • 為了實現實時,先將數據綁定提取出來成單獨的函數,這樣每次oninput事件觸發就調用一次getChange,
var myArea = document.getElementById('myArea');
//初始textarea的值先給input框
var input = document.getElementById('inputName');
input.value = myArea.value;
function getChange() {
    myUserProxy.name =myArea.value;
    console.log(myUserProxy.name);  //Lily
    console.log(document.getElementById('inputName').value);  //Lily
}
myArea.oninput = function () {
    getChange()
}

三:方案2:jQuery實現數據綁定

  • 記得先引入jquery庫
  • 為了實現實時,使用setTimeout間歇調用觸發keydown事件
$("#myArea").keydown(function () {
    myUserProxy.name = $("#myArea").val();
    console.log(myUserProxy.name);  //Lily
    console.log(document.getElementById('inputName').value);  //Lily
});
setTimeout(function () {
    $("#myArea").trigger('keydown')
},100);
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • (續jQuery基礎(1)) 第5章 DOM節點的復制與替換 (1)DOM拷貝clone() 克隆節點是DOM的常...
    凜0_0閱讀 1,360評論 0 8
  • 第1章 鼠標事件 1-1 jQuery鼠標事件之click與dbclick事件 用交互操作中,最簡單直接的操作就是...
    mo默22閱讀 1,295評論 0 6
  • 1.JQuery 基礎 改變web開發人員創造搞交互性界面的方式。設計者無需花費時間糾纏JS復雜的高級特性。 1....
    LaBaby_閱讀 1,200評論 0 1
  • 總結: 鼠標事件 1.click與dbclick事件$ele.click()$ele.click(handler(...
    阿r阿r閱讀 1,629評論 2 10
  • 多年之后,面對各種出軌劈腿的新聞時,我時常想起從武漢到上海的那個遙遠的旅途。 安徽金寨站,上來一個略顯豐滿的中年婦...
    說寧想說閱讀 137評論 0 2