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>
View Code
例項、掛載點、模板
例項裡,需指定掛載點,模板
模板指的是掛載點內部的內容:
- 可以寫在掛載點內部
- 也可以寫在例項的
template
屬性裡面
<script src="./vue.js"></script> <div id="root"></div> <script> new Vue({ el: "#root", template: `<h1>hello {{msg}}</h1>`, data: { msg: "world" } }) </script>
View Code
資料展示 事件繫結 方法定義
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>
View Code
<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>
View Code
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>
View Code
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>
View Code
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>
View Code
屬性繫結和雙向資料繫結
屬性繫結 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>
View Code
我們希望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>
View Code
當使用類似於 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>
View Code
雙向資料繫結 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>
View Code
但是資料並沒有發生同步變化,因為如果資料發生改變,下面展示的內容,也會根據輸入的內容發生相應的變化。所以這裡的改變,僅僅是改變了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>
View Code
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>
View Code
我們通過改造,將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>
View Code
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>
View Code
通過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>
View Code
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>
View Code
在模板中的 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>
View Code
記住使用 :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>
View Code