關(guān)于Vue的雙向數(shù)據(jù)綁定原理(一)Object.defineProperty

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

顧名思義:頁面改變影響數(shù)據(jù),數(shù)據(jù)改變也會影響頁面

頁面影響數(shù)據(jù)

首先是html代碼結(jié)構(gòu)

<body>
    <!-- onInput事件,當(dāng)內(nèi)容改變時,馬上出發(fā)input事件 -->
    <!-- 在標(biāo)簽上綁定事件,要傳入事件對象 -->
    <input type="text" id='myInp' onInput="fn(event)">
</body>

假設(shè)存儲數(shù)據(jù)的對象

   let data = {
        msg: ""
    }

頁面觸發(fā)的函數(shù)事件

  let fn = function (ev) {
        // 使用ev.target,拿到觸發(fā)事件的標(biāo)簽
        // console.log(ev.target.value)
        data.msg = ev.target.value
    }

測試:



這時候其實(shí)已經(jīng)完成了頁面輸入值,改變了數(shù)據(jù)

數(shù)據(jù)影響數(shù)據(jù)

我們使用Object.defineProperty方法

 let _data = {
        msg: ""
    }

    Object.defineProperty(data, 'msg', {
        set(value) {
            document.getElementById("myInp").innerHTML = value;
            document.getElementById('myInp').value = value
            _data['msg']=value
        },
        get() {
            return _data['msg']
        }
    })
為什么要重新定義一個_data呢?

這里的_data和data其實(shí)是一個映射關(guān)系,因為當(dāng)你獲取data對象里的msg屬性值的時候, 觸發(fā)get方法
如果在get方法里直接提取data.msg的值, 會造成遞歸調(diào)用卡死.

完整代碼

<body>
    <!-- onInput事件,當(dāng)內(nèi)容改變時,馬上出發(fā)input事件 -->
    <!-- 在標(biāo)簽上綁定事件,要傳入事件對象 -->
    <input type="text" id='myInp' onInput="fn(event)">
</body>

</html>
<script>
    // 首先定義一個fn()函數(shù),接著觸發(fā)事件的時候,會有ev事件對象
    let fn = function (ev) {
        // 使用ev.target,拿到觸發(fā)事件的標(biāo)簽
        // console.log(ev.target.value)
        data.msg = ev.target.value
    }
    // 需要一個保存變量的地方
    let data = {
        msg: ""
    }
    // 雙向數(shù)據(jù)綁定的原理,數(shù)據(jù)影響頁面
    // 使用Object.defineProperty方法,
    // 第一個參數(shù)是需要監(jiān)聽的對象,第二個參數(shù)是鍵的值,
    // 第三個參數(shù)是觸發(fā)set和get方法,固定寫法
    let _data = {
        msg: ""
    }

    Object.defineProperty(data, 'msg', {
        set(value) {
            document.getElementById("myInp").innerHTML = value;
            document.getElementById('myInp').value = value
            _data['msg']=value
        },
        get() {
            return _data['msg']
        }
    })
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容