1. 程式人生 > 其它 >vue資料的雙向繫結

vue資料的雙向繫結

什麼是資料雙向繫結? 

  vue是一個mvvm框架,即資料雙向繫結,即當資料發生變化的時候,檢視也就發生變化,當檢視發生變化的時候,資料也會跟著同步變化。這也算是vue的精髓之處了。值得注意的是,我們所說的資料雙向繫結,一定是對於UI控制元件來說的,非UI控制元件不會涉及到資料雙向繫結。 單向資料繫結是使用狀態管理工具(如redux)的前提。

一、訪問器屬性

Object.defineProperty()函式可以定義物件的屬性相關描述符, 其中的set和get函式對於完成資料雙向繫結起到了至關重要的作用,下面,我們看看這個函式的基本使用方式。 

var obj = {
      foo: 
'foo' } Object.defineProperty(obj, 'foo', { get: function () { console.log('將要讀取obj.foo屬性'); }, set: function (newVal) { console.log('當前值為', newVal); } }); obj.foo; // 將要讀取obj.foo屬性 obj.foo = 'name'; // 當前值為 name

get即為我們訪問屬性時呼叫,set為我們設定屬性值時呼叫。

二、簡單的資料雙向繫結實現方法

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>forvue</title>
</head>
<body>
  <input type="text" id="textInput">
  輸入:<span id="textSpan"></span>
  <script>
    var obj = {},
        textInput 
= document.querySelector('#textInput'), textSpan = document.querySelector('#textSpan'); Object.defineProperty(obj, 'foo', { set: function (newValue) { textInput.value = newValue; textSpan.innerHTML = newValue; } }); textInput.addEventListener('keyup', function (e) { obj.foo = e.target.value; }); </script> </body> </html>

使用Object.defineProperty()來定義屬性的set函式,屬性被賦值的時候,修改Input的value值以及span中的innerHTML;然後監聽input的keyup事件,修改物件的屬性值,即可實現這樣的一個簡單的資料雙向繫結。

三.具體實現資料繫結的思路

<div id="app">
        <input type="text" v-model="text">
        {{ text }}
    </div>  

    <script>
        var vm = new Vue({
            el: '#app', 
            data: {
                text: 'hello world'
            }
        });
    </script>

思路總結如下:

輸入框以及文字節點與 data 中的資料繫結

輸入框內容變化時,data 中的資料同步變化。即 view => model 的變化

data 中的資料變化時,文字節點的內容同步變化。即 model => view 的變化