Vue 實例
創建第一個實例
{{}}
被稱之為插值表達式。可以用來進行文本插值。

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Vue入門</title> <script src="./vue.js"></script> </head> <body> <div id="root">{{msg}}</div> <script> new Vue({ el: "#root", data: { msg: "hello world" } }) </script> </body> </html>
實例、掛載點、模板
實例里,需指定掛載點,模板

模板指的是掛載點內部的內容:
- 可以寫在掛載點內部
- 也可以寫在實例的
template
屬性里面

<script src="./vue.js"></script> <div id="root"></div> <script> new Vue({ el: "#root", template: '<h1>hello {{msg}}</h1>', data: { msg: "world" } }) </script>
數據展示 事件綁定 方法定義
v-text / v-html
類似於原生JS中的 innerText 與 innerHtml

<script src="./vue.js"></script> <div id="root"> <div v-text="content"></div> </div> <script> new Vue({ el: "#root", data: { content: "<h1>hello world</h1>" } }) </script>


<script src="./vue.js"></script> <div id="root"> <div v-html="content"></div> </div> <script> new Vue({ el: "#root", data: { content: "<h1>hello world</h1>" } }) </script>

v-on 事件
通過 v-on
給元素綁定事件,事件觸發之后執行的方法寫在 Vue 實例里面的 methods
方法里,這樣方法里面的事件就可以執行了。

<script src="./vue.js"></script> <body> <div id="root"> <div v-on:click="handleClick">{{content}}</div> <!-- 添加v-on:click事件 --> </div> <script> new Vue({ el: "#root", data: { content: "click me" }, methods: { handleClick: function() { alert(123) } } }) </script> </body>
Vue 中的 DOM 改動
在Vuejs中想要改變數據的顯示,不要去改變 DOM。直接改變數據即可。當數據發生變化的時候,Vue會自己去改變 DOM。

<script src="./vue.js"></script> <body> <div id="root"> <div v-on:click="handleClick">{{content}}</div> </div> <script> new Vue({ el: "#root", data: { content: "click me" }, methods: { handleClick: function() { alert('yes') this.content = "clicked" //改變數據 } } }) </script> </body>
JSbin 預覽
從這個案例可以看出 Vuejs 不再面向 DOM 進行操作,而是面向數據進行操作。
@
v-on:
可以簡寫成 @
,即

<script src="./vue.js"></script> <body> <div id="root"> <div @click="handleClick">{{content}}</div> </div> <script> new Vue({ el: "#root", data: { content: "click me" }, methods: { handleClick: function() { alert('yes') this.content = "clicked" //改變數據 } } }) </script> </body>
屬性綁定和雙向數據綁定
屬性綁定 v-bind:
當鼠標放置到這個div
上的時候,會顯示出title
,內容是 this is hello world

<script src="./vue.js"></script> <body> <div id="root"> <div title="this is hello world">hello world</div> </div> <script> new Vue({ el: "#root" }) </script> </body>
我們希望title可變,所以我們在實例里面,去定義一個 title
。並使用 v-bind:
將 title
與 title
數據項做一個綁定。 如果想改變內容,只需要改變title的數據就可以了。

<script src="./vue.js"></script> <body> <div id="root"> <div v-bind:title="title">hello world</div> <!-- 使用v-bind:進行綁定 --> </div> <script> new Vue({ el: "#root", data: { title: "this is hello world" } }) </script> </body>

當使用類似於 v-bind:title
的模板指令,相應的=
后面的內容就不再是一個字符串,而是一個 JS 的表達式。
即v-bind:title="title"
后面的"title"
表示實例中 data
里面的 title
。
:
v-bind:
可以簡寫成:
,即

<script src="./vue.js"></script> <body> <div id="root"> <div :title="title">hello world</div> <!-- 使用 :title 進行綁定 --> </div> <script> new Vue({ el: "#root", data: { title: "this is hello world" } }) </script> </body>
雙向數據綁定 v-model
在這個案例中,有一個input
標簽,使用 :value="content"
數據進行綁定

<script src="./vue.js"></script> <body> <div id="root"> <div :title="title">hello world</div> <input :value="content"/> <div>{{content}}</div> </div> <script> new Vue({ el: "#root", data: { title: "this is hello world", content: "this is content" } }) </script> </body>
但是數據並沒有發生同步變化,因為如果數據發生改變,下面展示的內容,也會根據輸入的內容發生相應的變化。所以這里的改變,僅僅是改變了input
標簽中的value
值,並沒有使data
中的content
發生變化。

所以我們使用 v-model
這個模板指令,進行數據雙向綁定。

<script src="./vue.js"></script> <body> <div id="root"> <div :title="title">hello world</div> <input v-model="content"/> <div>{{content}}</div> </div> <script> new Vue({ el: "#root", data: { title: "this is hello world", content: "this is content" } }) </script> </body>
JSbin 預覽
在input
標簽中,使用v-model
就可以完成雙向數據的綁定,效果如下圖。

計算屬性和偵聽器
計算屬性 computed
在這個案例中,使用上面已經提到過的v-model
進行雙向數據綁定之后,在input
標簽中輸入相應的數據,會把firstName
和lastName
拼裝好了之后在div
中一起展現出來。

<script src="./vue.js"></script> <body> <div id="root"> 姓:<input v-model="firstName"/> 名:<input v-model="lastName"/> <div>{{firstName}}{{lastName}}</div> </div> <script> new Vue({ el: "#root", data: { firstName: '', lastName: '' } }) </script> </body>
JSbin 預覽
我們通過改造,將firstName
和lastName
糅合成一個變量,取名為fullName
。即fullName
是通過firstName
和lastName
計算而成的一個新的變量。遇到這種情況,通過計算屬性解決。
在Vue的實例配置對象里面,配置computed
對象屬性,在里面定義一個fullName
函數,返回值是 this.firstName + ' ' + this.lastName

<script src="./vue.js"></script> <body> <div id="root"> 姓:<input v-model="firstName"/> 名:<input v-model="lastName"/> <div>{{fullName}}</div> </div> <script> new Vue({ el: "#root", data: { firstName: '', lastName: '' }, computed: { //定義一個computed對象,在里面定義fullName函數 fullName: function(){ return this.firstName + ' ' + this.lastName } } }) </script> </body>
computed
值的是一個屬性,通過其他屬性計算而來。優點是 computed
中參與計算的值如果都沒有改變,會使用上一次計算得到的緩存結果,不會重新計算。只有參數計算的值發生變化的時候,才會重新計算。
偵聽器 watch
監聽某一個數據的變化,一旦數據發生變化,就可以在偵聽器中實現某個業務邏輯。

<script src="./vue.js"></script> <body> <div id="root"> 姓:<input v-model="firstName"/> 名:<input v-model="lastName"/> <div>{{fullName}}</div> <div>{{count}}</div> </div> <script> new Vue({ el: "#root", data: { firstName: '', lastName: '', count: 0 //定義變量 count,默認值為 0 }, computed: { fullName: function(){ return this.firstName + ' ' + this.lastName } }, watch: { //定義偵聽器 firstName: function(){ //監聽 firstName 的變化 this.count ++ }, lastName: function(){ //監聽 lastName 的變化 this.count ++ } } }) </script> </body>
通過watch
的形式進行偵聽器的定義。
當對fristName
或lastName
做任意的變更,count
數值 +1
當然我們也可以只對 fullName
做監聽,即針對計算屬性做監聽。

<script src="./vue.js"></script> <body> <div id="root"> 姓:<input v-model="firstName"/> 名:<input v-model="lastName"/> <div>{{fullName}}</div> <div>{{count}}</div> </div> <script> new Vue({ el: "#root", data: { firstName: '', lastName: '', count: 0 }, computed: { fullName: function(){ return this.firstName + ' ' + this.lastName } }, watch: { fullName: function(){ this.count } } }) </script> </body>
v-if v-show 與 v-for
v-if

<script src="./vue.js"></script> <body> <div id="root"> <div v-if="show">hello world</div> <button @click="handleClick">toggle</button> </div> <script> new Vue({ el: "#root", data: { show: true }, methods: { handleClick: function(){ this.show = !this.show } } }) </script> </body>
在模板中的 data
添加 show
屬性,值為 true
,並在 div
標簽中添加 v-if="show"
的指令,並對 button
元素綁定 @click
事件,在模板中的 methods
添加對應事件的函數。
達到點擊 button
切換 hello world 的顯示和隱藏效果。
JSbin 預覽
即在使用 v-if
指令時,當它對應的數據向的指令對應的是 false
時,會將這個標簽,直接從 DOM 中移除。
v-show
使用 v-show
,看上去效果和 v-if
是一樣的效果,但點開控制台觀察 DOM 結構的變化,v-show
並不會使 DOM節點 發生刪除和添加,它的隱藏是在這個節點上添加了一個display: none;
的 CSS 屬性。
即 v-show
不會頻繁的 銷毀 和 創建DOM。在有頻繁的顯示和隱藏需求時,使用 v-show
對於性能來講,應該是更好的選擇。
如果只有一次顯示、隱藏的需求,對於使用 v-if
可能是更好的選擇。
v-for
當有一個數據需要做循環展示時,幫助我們進行操作。

<script src="./vue.js"></script> <body> <div id="root"> <div v-if="show">hello world</div> <button @click="handleClick">toggle</button> <ul> <!-- 在li標簽中 添加v-for指令 使用:key屬性提升渲染性能 --> <li v-for="item of list" :key="item">{{item}}</li> </ul> </div> <script> new Vue({ el: "#root", data: { show: true, list: [1,2,3] //添加list數組 }, methods: { handleClick: function(){ this.show = !this.show } } }) </script> </body>
JSbin 預覽
記住使用 :key
屬性提升渲染性能,每次的:key
屬性都不相同,所以可以使用 "item"
作為他的屬性值。
但如果數組中本身有重復的值。這個時候:key
屬性值就不能使用 "item"
作為他的屬性值了。這個時候,我們將 v-for
設置成 v-for="(item,index) of list"
然后讓:key
屬性值為 index
,保證它的唯一性。
但如果平凡對列表進行變更的時候,index
的使用也是有問題的。

<body> <div id="root"> <div v-if="show">hello world</div> <button @click="handleClick">toggle</button> <ul> <!-- 在li標簽中 添加v-for指令 使用:key屬性提升渲染性能 並使用index值--> <li v-for="(item,index) of list" :key="index">{{item}}</li> </ul> </div> <script> new Vue({ el: "#root", data: { show: true, list: [1,2,3] //添加list數組 }, methods: { handleClick: function(){ this.show = !this.show } } }) </script> </body>