Vue.js是以資料狀態操作畫面,偏向MVVM軟體設計模式。
MVVM(Model View Viewmodel)
英文 |
Model |
View |
Viewmodel |
中文 |
模型 |
視圖 |
資料聯繫器 |
MVC(Model View Controller)
英文 |
Model |
View |
Controller |
Database |
中文 |
模型 |
視圖 |
控制器 |
資料庫 |
- [視圖]→發送請求→[控制器]→[模型]→[資料庫]→回傳資料→[模型]→[控制器]→渲染→[視圖]
生命週期
英文 |
中文 |
說明 |
|
開始創建 |
|
beforeCreate |
準備載入資料 |
|
|
數據觀測建立 |
|
created |
載入資料 |
要載入ajax要在這階段之後 |
|
編譯模板 |
|
beforeMount |
準備繪製元件 |
|
|
模板建立完成 |
|
mounted |
繪製元件 |
要操作DOM元素要在這階段之後 |
|
資料變動 |
|
updated |
更新資料時觸發 |
|
activated |
|
有<keep-alive>時才會觸發 |
deactivated |
|
有<keep-alive>時才會觸發 |
beforeDestroy |
準備移除資料 |
|
|
移除觀測、子元件、監聽事件 |
|
destroyed |
移除資料 |
|
開始使用Vue.js
- 使用 element (簡化:el)綁定HTML上的DOM元素。
1
2
3
|
var app = new Vue({
el: "#app"
});
|
v-text
- 使用 v-text 可將資料裡的"文字"帶入<標籤>。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
// <-----html----->
#app
p(v-text="a")
//簡化:p {{a}}
// <-----js----->
var app = new Vue({
el: "#app",
data:{
a: "蘋果"
}
});
// <-----結果----->
#app
p 蘋果
|
v-html
- 使用 v-html 可將資料裡的HTML帶入<標籤>。
不建議在網頁上任意使用v-html,因為會容易遭受XSS攻擊,例如:輸入框
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
// <-----html----->
#app
ul(v-html="a")
// <-----js----->
var app = new Vue({
el:"#app",
data:{
a:"<li>蘋果</li>"
}
});
// <-----結果----->
#app
ul
li 蘋果
|
v-model
- 使用v-model可以產生雙向綁定,在修改值時會同時改變。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
// <-----html----->
#app
input(v-model="a")
p {{a}}
// <-----js----->
var app = new Vue({
el:"#app",
data:{
a:"蘋果"
}
});
// <-----結果----->
//<input>一開始會顯示"蘋果"
//<p>一開始會顯示"蘋果"
//當<input>裡的文字被更動了,,<p>也會跟著改變
|
v-bind
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
// <-----html----->
#app
img(v-bind:src="a" v-bind:class="b")
//簡化:img(:src="a" v-bind:class="b")
// <-----js----->
var app = new Vue({
el:"#app",
data:{
a:"images/picture.png",
b:"img-fluid"
//Bootstrap的語法
}
});
// <-----結果----->
#app
img(src="images/picture.png" class="img-fluid")
|
v-for
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
// <-----html----->
#app
ul
li(v-for="(item,key) in a") {{key+1}}{{item.name}}
//key等於陣列[第幾項]
// <-----js----->
var app = new Vue({
el:"#app",
data:{
a:[
{name: "蘋果", amount: 100},
{name: "香蕉", amount: 300}
]
}
});
// <-----結果----->
#app
ul
li 1蘋果
li 2香蕉
|
v-if
名稱 |
v-if |
v-show |
效果 |
DOM元素消失 |
display:none |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
// <-----html----->
#app
ul
li(v-for="item in a" v-if="item.amount > 200") {{item.name}}
//判斷陣列裡的[amount]大於200的才顯示
// <-----js----->
var app = new Vue({
el: "#app",
data:{
a:[
{name: "蘋果", amount: 100},
{name: "香蕉", amount: 300}
]
}
});
// <-----結果----->
#app
ul
li 香蕉
|
v-on
- 使用 v-on 可增加使用者事件,例如滑鼠點擊、按下鍵盤等。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
// <-----html----->
#app
button(v-on:click="add") 按鈕
//簡化寫法
//button(@click="add") 按鈕
p {{price}}
// <-----js----->
var app = new Vue({
el:"#app",
data:{
price: 25
},
methods:{
add:function(){
this.price = this.price + 5;
}
}
});
// <-----結果----->
//<p>一開始顯示25
//每次點擊"按鈕"時,25都+5
|
v-class動態切換效果
- 使用 :class 可綁定<標籤>,判斷是否套用CSS樣式。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
// <-----html----->
#app
button(@click="a=!a" :class="{'red':a}") 按鈕
//:class="{'css樣式名稱':判斷式}"
// <-----css----->
.red
background-color: red
// <-----js----->
var app = new Vue({
el:"#app",
data:{
a: false
}
});
// <-----結果----->
//當點擊的時候"按鈕"時會變紅色
|
其他相關