1. 程式人生 > 其它 >Vue單向繫結與雙向繫結

Vue單向繫結與雙向繫結

概述
Vue.js 最顯著的特點就是響應式和資料驅動,也就是將Model和View進行單向繫結或者雙向繫結。

單向繫結:把Model繫結到View,當我們用JavaScript程式碼更新Model時,View就會自動更新。因此,我們不需要進行額外的DOM操作,只需要進行Model的操作就可以實現檢視的聯動更新。

雙向繫結:把Model繫結到View的同時也將View繫結到Model上,這樣就既可以通過更新Model來實現View的自動更新,也可以通過更新View來實現Model資料的更新。所以,當我們用JavaScript程式碼更新Model時,View就會自動更新,反之,如果使用者更新了View,Model的資料也自動被更新了。

弄清了它的這種資料繫結的機制,我們再來看Vue.js程式碼就會很清晰了,Vue.js主要有三種資料繫結形式,並且都是基於單向繫結和雙向繫結。

插值形式
插值形式就是{{data}}的形式,它使用的是單向繫結。
我們首先定義好一個JavaScript物件作為Model,並且把這個Model的兩個屬性繫結到DOM節點上:

 1 <body>
 2 <div id="vm">
 3     <p>Hello, {{name}}!</p>
 4     <p>You are {{age}} years old!</p>
 5 </div>
 6
</body> 7 8 9 <script src="https://cdn.jsdelivr.net/npm/vue"></script> 10 <script type="text/javascript"> 11 var vm = new Vue({ 12 el: '#vm', 13 data: { 14 name: 'DroidMind', 15 age: 18 16 } 17 }); 18 </script> 19 ————————————————
20 版權宣告:本文為CSDN博主「DroidMind」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。 21 原文連結:https://blog.csdn.net/hp910315/article/details/79658610

Vue例項就是ViewModel的代理物件:
el: 指定了要把Model繫結到id為vm的DOM節點上。
data: 指定了Model,我們初始化了Model的兩個屬性name和age,在View內部的<p>節點上,可以直接用{{ name }}引用Model的某個屬性。

當我們建立一個Vue例項,Vue可以自動把Model的狀態對映到el指定的View上,並且實現繫結,這樣我們就可以通過Model的操作來實現對DOM的聯動更新,例如,開啟瀏覽器console,在控制檯輸入vm.name = 'Bob',執行上述程式碼,可以觀察到頁面立刻發生了變化,原來的Hello, Robot!自動變成了Hello, Bob!。Vue作為MVVM框架會自動監聽Model的任何變化,在Model資料變化時,更新View的顯示。這種Model到View的繫結就是單向繫結。

v-bind形式
如果我們希望html的某些屬效能夠支援單向繫結,我們只需要在該屬性前面加上v-bind:指令,這樣Vue在解析的時候會識別出該指令,就會將該將其屬性的值跟Vue例項的Model進行繫結。這樣我們就可以通過Model來動態的操作該屬性從而實現DOM的聯動更新。
例如:<p class="classed">
上面<p>節點的class樣式指定的值為classed,它是一個靜態的屬性值,如果我們希望將該屬性值跟Model進行一個繫結,只需要加上一個v-bind:指令,如下所示:
<p v-bind:class="classed">
繫結之後,classed不再是一個靜態的字串,而是vue例項中的data.classed變數,也就是它跟Model的classed進行了繫結,所以我們可以通過操作Model的classed來實現對View的class屬性的動態更新,從而實現View的動態更新。

 1 <body>
 2 <div id="vm">
 3     <p v-bind:class="classed">Hello, {{name}}!</p>
 4 </div>
 5 </body>
 6  
 7  
 8 <script src="https://cdn.jsdelivr.net/npm/vue"></script>
 9 <script type="text/javascript">
10     var vm = new Vue({
11         el: '#vm',
12         data: {
13             name: 'DroidMind',
14             classed: 'red'
15         }
16     });
17 </script>
18  
19  
20 <style>
21     .red {
22         background: red;
23     }
24  
25  
26     .blue {
27         background: blue;
28     }
29 </style>

如上面程式碼所示,vm.classed的初始值為red,此時<p>的樣式屬性對應的是.red,此時背景就為紅色,我們可以通過在瀏覽器的控制檯輸入vm.classed='bule',此時背景就自動變成了藍色。可以看到通過對class屬性進行繫結我們就可以動態的改變class對應的樣式,這個都是通過Model的操作完成的,沒有設定任何的DOM操作。

v-model形式 
v-model主要是用在表單元素中,實現了雙向繫結。
當用戶填寫表單時,View的狀態就被更新了,如果此時Model的資料也會隨著輸入的資料動態的更新,那就相當於我們把Model和View做了雙向繫結。

 1 <body>
 2 <form id="vm" action="#">
 3     <p><input v-model="email"></p>
 4     <p><input v-model="name"></p>
 5 </form>
 6  
 7  
 8 </body>
 9 <script src="https://cdn.jsdelivr.net/npm/vue"></script>
10 <script type="text/javascript">
11     var vm = new Vue({
12         el: '#vm',
13         data: {
14             email: '',
15             name: ''
16         }
17     });
18 </script>

我們可以在表單中輸入內容,然後在瀏覽器console中用vm.$data檢視Model的內容,也可以用vm.name檢視Model的name屬性,它的值和FORM表單對應的<input>是一致的。如果在瀏覽器console中用JavaScript更新Model,例如,執行vm.name='Bob',表單對應的<input>內容就會立刻更新。可以看到通過v-model實現了表單資料和Model資料的雙向繫結。

  

 把上面的內容搞清楚了,我們就可以清楚的知道Vue.js中View跟Vue例項之間的關係了,寫起程式碼來整個思路也變得非常的清晰,如果沒有把上面的原理搞清楚,學習Vue.js肯定就是雲裡霧裡,不知所然。