第九章 監控系統-zabbix深入應用監控
Vue的基本使用
Vue的指令與過濾器
指令的概念
指令(Directives)是vue為開發者提供的模板語法,用於輔助開發者渲染頁面的基本結構。
指令的分類
vue中的指令按照不同的用途可以分為6大類:
- 內容渲染指令
- 屬性繫結指定
- 事件繫結指令
- 雙向繫結指令
- 條件渲染指令
- 列表渲染指令
指令是vue開發中最基礎、最常用、最簡單的知識點
內容渲染指令
內容渲染指令用來輔助開發者渲染DOM元素的文字內容。
常用的內容渲染指令有如下3個:
- v-text
- {{}}
- v-html
v-text
會覆蓋標籤中原有的內容
插值表示式
也就是{{}}
專門又來解決v-text會覆蓋預設文字的問題
v-html
如果要把包含html標籤的字串渲染為頁面的HTML元素,則需要用到v-html這個指令。
在 vue 提供的模板渲染語法中,除了支援繫結簡單的資料值之外,還支援JavaScript表示式的運算。
{{ number + 1 }}
{{ ok ? 'YES' : 'NO' }}
{{ message.split('').reverse().join('') }}
<div :id="'list-'+ id"></div>
屬性繫結指令
插值表達是隻能用在內容節點而不能用在屬性節點。
如果需要為元素的屬性動態繫結屬性值,則需要用到v-bind屬性繫結指令。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <div id="app"> <input type="text" v-bind:placeholder="tips"> <br> <hr> <!-- v-bind 可以簡寫為 : --> <img :src="photo" alt="" style="width: 100px; height: 100px;"> </div> <!-- 開發環境版本,包含了有幫助的命令列警告 --> <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script> <script> const vm = new Vue({ el: '#app', data: { tips: "Please input username", photo: "https://cn.vuejs.org/images/logo.svg" } }) </script> </body> </html>
v-bind 可以簡寫為 :
繫結的內容如果需要拼接,則字串的外面應該包裹單引號
v-bind會作為js表示式被解析
事件繫結指令
vue 提供了 v-on
事件繫結指令,用來輔助程式設計師為 DOM 元素繫結事件監聽。
在methods中定義事件處理函式,格式如下:
methods: {
add: funtion() {
}
}
其簡寫形式:
methods: {
add() {}
}
在methods方法中,可以使用建立的例項物件(vm或this)來訪問資料來源。
在繫結事件處理函式的時候,可以使用()傳遞引數
v-on:
可以簡寫為@
事件物件$event
事件修飾符
在事件處理函式中呼叫event.preventDefault()或event.stopPropagation()是非常常見的需求。因此,vue提供了時間修飾符的概念,來輔助程式設計師更方便地對事件的出發進行控制。
事件修飾符 | 說明 |
---|---|
.prevent | 阻止預設行為 |
.stop | 阻止事件冒泡 |
.capture | 以捕獲模式出發當前的事件處理函式 |
.once | 繫結的事件只觸發一次 |
.self | 只有在event.target是當前元素自身是出發事件處理函式 |
按鍵修飾符
在監聽鍵盤事件時,我們經常需要判斷詳細的按鍵。此時,可以為鍵盤相關的事件新增按鍵修飾符。
雙向資料繫結指令
vue提供了v-model
雙向資料繫結指令,用來輔助開發者不操作DOM的前提下,快速獲取表單的資料。
v-model只能和一些表單元素使用才有意義
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>事件繫結指令</title>
</head>
<body>
<div id="app">
<input type="text" v-model="username">
<p>使用者名稱:{{username}}</p>
</div>
<!-- 開發環境版本,包含了有幫助的命令列警告 -->
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<script>
const vm = new Vue({
el: '#app',
data: {
username: 'zihoo'
},
// 定義事件處理函式
methods: {
}
})
</script>
</body>
</html>
指令修飾符
為了方便對使用者輸入的內容進行處理,vue為v-model指令提供了3個修飾符,分別是:
修飾符 | 作用 | 示例 |
---|---|---|
.number | 自動將使用者的輸入值轉為數值型別 | |
.trim | 自動過濾使用者輸入的首尾空白字元 | |
.lazy | 在”change“時而非”input“時更新 |
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>v-model的修飾符</title>
</head>
<body>
<div id="app">
<div>
<h4>.number</h4>
<input type="text" v-model.number="num1"> + <input type="text" v-model.number="num2"> = {{num1 + num2}}
</div>
<div>
<h4>.trim</h4>
<input type="text" v-model.trim="username">
<button @click="showName">獲取使用者名稱</button>
</div>
<div>
<h4>.lazy</h4>
<p>data不會實時改變,當輸入框失去焦點時,資料同步</p>
<input type="text" v-model.lazy="username">
</div>
</div>
<!-- 開發環境版本,包含了有幫助的命令列警告 -->
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<script>
const vm = new Vue({
el: '#app',
data: {
num1: 0,
num2: 0,
username: ''
},
// 定義事件處理函式
methods: {
showName() {
alert("username ==>" + this.username)
}
}
})
</script>
</body>
</html>
條件渲染指令
v-if 會動態新增或刪除元素
v-show 使用display: none
來隱藏元素
v-if的配套指令
- v-else-if
- v-else
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>v-model的修飾符</title>
</head>
<body>
<div id="app">
<div>
<h4>v-if和v-show的區別</h4>
<p v-if="flag">v-if 的條件渲染</p>
<p v-show="flag">v-show 的條件渲染</p>
</div>
<div>
<h4>v-if的配套語法</h4>
<div v-if="type === 'A'">優秀</div>
<div v-else-if="type === 'B'">良好</div>
<div v-else-if="type === 'C'">一般</div>
<div v-else>差</div>
</div>
</div>
<!-- 開發環境版本,包含了有幫助的命令列警告 -->
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<script>
const vm = new Vue({
el: '#app',
data: {
flag: true,
type: 'A'
},
// 定義事件處理函式
methods: {
}
})
</script>
</body>
</html>
列表渲染指令
vue提供了v-for
列表渲染指令,用來輔助開發者基於一個數組來迴圈渲染一個列表結構。
v-for
指令需要使用item in items形式的特殊語法
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>v-model的修飾符</title>
</head>
<body>
<div id="app">
<table>
<thead>
<tr>
<th>序號</th>
<th>id</th>
<th>姓名</th>
</tr>
</thead>
<tbody>
<tr v-for="item, index in list">
<td>{{index + 1}}</td>
<td>{{item.id}}</td>
<td>{{item.name}}</td>
</tr>
</tbody>
</table>
</div>
<!-- 開發環境版本,包含了有幫助的命令列警告 -->
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<script>
const vm = new Vue({
el: '#app',
data: {
list: [
{id: 1, name: 'lisi'},
{id: 2, name: 'zhangsan'},
{id: 3, name: 'wangwu'}
]
}
})
</script>
</body>
</html>
官方簡易:只要用到了v-for指令,那麼一定要繫結一個:key屬性。而且,儘量把id作為key的值。官方對key的值型別也是有要求的,只能是字串或者數字型別。
過濾器
過濾器(Filters)是Vue為開發者提供的功能,常用於文字的格式化。過濾器可以用在兩個地方:插值表示式和v-bind屬性繫結
過濾器應該在JavaScript表示式的尾部,由“管道符”進行呼叫
私有過濾器
一般定義的,在filters節點下定義的過濾器都為私有過濾器
公有過濾器
獨立於每個vm例項之外
Vue.filter()方法接收兩個引數:
- 全域性過濾器的名字
- 全域性過濾器的處理函式
如果全域性過濾器和私有過濾器名字重複,則按照就近原則,優先使用私有過濾器
連續呼叫多個過濾器
過濾器可以連續呼叫多個
過濾器傳參
<p>
{{message | filterA(arg1, arg2)}}
</p>
Vue.filter('filterA', (msg, arg1, arg2) => {
// 過濾器程式碼邏輯
})
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>v-model的修飾符</title>
</head>
<body>
<div id="app">
<h4>過濾器</h4>
<p>原字串:{{message}}</p>
<p>過濾後的字串:{{message | capitalize}}</p>
</div>
<div id="app2">
<h4>公有過濾器</h4>
<p>原字串:{{ message }}</p>
<p>過濾後的字串:{{message | capitalize}}</p>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<script>
Vue.filter('capitalize', str => {
return str.toUpperCase() + "~~~"
})
const vm = new Vue({
el: '#app',
data: {
message: "hello vue.js"
},
// 定義過濾器函式
filters: {
// 形參值是管道符前面的值
capitalize(val) {
// 過濾器中一定要有一個返回值
return val.toUpperCase()
}
}
})
const vm2 = new Vue({
el: '#app2',
data: {
message: 'hello vue.js'
}
})
</script>
</body>
</html>