📢 本文由 gemini-2.5-flash 翻譯
Vue 指令
Vue 會根據不同的指令,針對標籤實現不同的功能,指令為帶有 v- 前綴的特殊標籤屬性
v-html
用於設定元素的 innerHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| <html>
<head>
<meta charset="utf-8">
<title>v-html</title>
</head>
<body>
<div id="app">
<div v-html="link"></div>
</div>
<script src="js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
link:'<a href="https://yexca.net/">yexca</a>'
}
})
</script>
</body>
</html>
|
v-show 與 v-if
| \ | v-show | v-if |
|---|
| 作用 | 控制元素顯示隱藏 | 控制元素顯示隱藏 (條件渲染) |
| 語法 | v-show=“表達式” | v-if=“表達式” |
| 表達式值 | ture 顯示,false 隱藏 | ture 顯示,false 隱藏 |
| 隱藏說明 | 透過控制屬性 style="display:none;" | 直接刪除或建立元素 |
| 情境 | 頻繁切換 | 不頻繁切換 |
v-else 與 v-else-if
用於輔助 v-if 進行渲染,需要緊挨著 v-if 一起使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| <html>
<head>
<meta charset="utf-8">
<title>v-else and v-else-if</title>
</head>
<body>
<div id="app">
<p v-if="gender === 1">性別:男</p>
<p v-else>性別:女</p>
<hr />
<p v-if="score >= 90">成績判定 A</p>
<p v-else-if="score >= 70">成績判定 B</p>
<p v-else-if="score >= 60">成績判定 C</p>
<p v-else>成績判定 D</p>
</div>
<script src="js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
gender: 1,
score: 89
}
})
</script>
</body>
</html>
|
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
24
25
26
27
28
29
| <html>
<head>
<meta charset="utf-8">
<title>v-on 1</title>
</head>
<body>
<div id="app">
<button v-on:click="count1--">-</button>
<span>{{count1}} </span>
<!-- v-on: 可以替換為 @ -->
<button @click="count1++">+</button>
<hr />
<button v-on:mouseenter="count2--">-</button>
<span>{{count2}}</span>
<button v-on:mouseenter="count2++">+</button>
</div>
<script src="js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
count1: 1,
count2: 2
}
})
</script>
</body>
</html>
|
語法二
v-on:事件名=“methods中的函數名”
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| <html>
<head>
<meta charset="utf-8">
<title>v-on 2</title>
</head>
<body>
<div id="app">
<button @click="fun">切換顯示隱藏</button>
<p v-show="isShow">hello yexca</p>
</div>
<script src="js/vue.js"></script>
<script>
const app = new Vue({
el: "#app",
data: {
isShow: true
},
methods: {
fun(){
// this 始終指向當前實例
this.isShow = !this.isShow
}
}
})
</script>
</body>
</html>
|
呼叫傳參
直接看範例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
| <html>
<head>
<meta charset="utf-8">
<title>v-on 3</title>
<style>
.box{
border-style: solid;
border-color: aqua;
padding: 10px;
margin: 10px;
width: 200px;
}
</style>
</head>
<body>
<div id="app">
<div class="box">
<h3>自動販賣機</h3>
<button @click="fun(5)">可樂5元</button>
<button @click="fun(10)">咖啡10元</button>
</div>
<div style="padding-left: 20px;">餘額:{{balance}}</div>
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: "#app",
data: {
balance: 900
},
methods: {
fun(a){
this.balance -= a
}
}
})
</script>
</body>
</html>
|
v-bind
用於動態設定 HTML 的標籤屬性,例如 src、url、title 等
語法:v-bind:屬性名=“表達式”
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| <html>
<head>
<meta charset="utf-8">
<title>v-bind</title>
<style>
img{
width: 400px;
}
</style>
</head>
<body>
<div id="app">
<!-- v-bind 可以省略 -->
<img v-bind:src="imgURL" :title="imgTitle" :alt="imgAlt" />
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
imgURL: '../img/01.jpg',
imgTitle: 'warma',
imgAlt: 'warma'
}
})
</script>
</body>
</html>
|
v-for
基於資料循環,多次渲染整個元素
語法:v-for="(item, index) in 陣列"
item:每一個項目,index:索引
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| <html>
<head>
<meta charset="utf-8">
<title>v-for</title>
</head>
<body>
<div id="app">
<h3>fruit shop</h3>
<ul>
<!-- 當 index 不需要時可以省略 -->
<li v-for="item in list">{{ item }}</li>
</ul>
<ul>
<li v-for="(item,index) in list">{{ index }}</li>
</ul>
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
list: ['apple', 'banana', 'watermelon']
}
})
</script>
</body>
</html>
|
為便於 Vue 進行列表項目的正確排序與重複利用,需要給元素加入唯一識別,即 key 屬性
key 的值只能是字串或數字型別,且必須具有唯一性
1
| <li v-for="(item, index) in list" :key="item.id"></li>
|
建議使用 id 作為 key,不建議使用 index 作為 key (會變化,不對應)
v-model
給表單元素使用,實現雙向資料綁定,以便快速取得或設定表單元素內容
雙向資料綁定即視圖變化,資料自動更新
語法:v-model=‘變數’
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
| <html>
<head>
<meta charset="utf-8">
<title>v-model</title>
</head>
<body>
<div id="app">
username: <input type="text" v-model="username"/><br /><br />
password: <input type="password" v-model="password" /><br /><br />
<button @click="login">登入</button>
<button @click="reset">重設</button>
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
username: '',
password: ''
},
methods: {
login(){
console.log(this.username, this.password)
},
reset(){
this.username = ''
this.password = ''
}
}
})
</script>
</body>
</html>
|
指令修飾符
透過 . 指明一些指令後綴,不同後綴封裝了不同的處理操作
按鍵修飾符
@keyup.enter 鍵盤 Enter 鍵監聽
v-model 修飾符
v-model.trim 去除首尾空白
v-model.number 轉為數字
事件修飾符
@事件名.stop 阻止事件冒泡
@事件名.prevent 阻止預設行為
計算屬性
基於現有的資料,計算出來的新屬性。依賴的資料變化,會自動重新計算
1
2
3
4
5
6
7
8
9
10
11
| new Vue(){
el: "#app",
data: {
count: 0,
},
computed: {
doubleCount() {
return this.count * 2;
},
},
}
|
Vue 生命週期
生命週期指一個物件從建立到銷毀的整個過程
Vue 生命週期有 8 個階段,每觸發一個生命週期事件,會自動執行一個生命週期方法 (鉤子)
| 狀態 | 階段週期 |
|---|
| beforeCreate | 建立前 |
| created | 建立後 |
| beforeMount | 載入前 |
| mounted | 掛載完成 |
| beforeUpdate | 更新前 |
| updated | 更新後 |
| beforeDestroy | 銷毀前 |
| destroyed | 銷毀後 |
其中 mounted 較為常用,指 Vue 初始化成功,HTML 渲染成功。(發送請求到伺服器,載入資料)
1
2
3
4
5
6
7
8
9
10
11
12
| new Vue(){
el: "#app",
data: {
},
mounted(){
console.log("Vue 掛載完成,發送請求取得資料");
},
methods: {
}
}
|