Vue.js
本章內容:
指令
指令前綴帶有 v- ,表示他們是 Vue 提供的特殊特性,通過與數據配合使用, 完成特定的功能。
v-bind
綁定屬性,用來綁定data
中的某一個數據,或者是動態數據。
<div id="app">
<!-- 傳統語法 -->
<p v-bind:title="message">快用光標懸浮我!~ ~ </p>
<!-- 簡寫語法 -->
<p :title="message">快用光標懸浮我!~ ~ </p>
</div>
new Vue({
el: "#app",
data: {
message: "誰TM買小米?"
}
})
v-bind行內樣式設定
<div id="app">
<!-- Object -->
<p :style="{color: 'red', fontSize: '40px'}">v-bind行內樣式設定</p>
<!-- Array.Object -->
<p :style="[{color: 'skyblue'}, {fontSize: '40px'}]">v-bind行內樣式設定</p>
<!-- Array.data.Object 數組存放data中的對象數據-->
<p :style="[color, fontSize]">v-bind行內樣式設定</p>
</div>
new Vue({
el: "#app",
data: {
color: {color: 'pink'},
fontSize: {fontSize: '50px'}
}
})
v-bind類名(class)
設定
<style>
.box.red {
color: red;
}
.box.shadow {
text-shadow: 0 0 4px #f60;
}
.box.size {
font-size: 30px;
}
</style>
<div id="app">
<!-- 添加多個類名語法 -->
<p class="box" :class="['red', 'shadow']">v-bind類名(class)設定 - 1</p>
<!-- 爲true就添加這個類名,也可以應用表達式。 -->
<p class="box" :class="{size: true, shadow: false, red: n > 0}">v-bind類名(class)設定 - 2</p>
</div>
new Vue({
el: "#app",
data: {
n: 10
}
})
v-on
綁定事件,也可以是簡寫 @
。
<div id="app">
<!-- 傳統語法 -->
<button v-on:click="clickFn()">v-on</button>
<!-- 簡寫語法,建議簡寫。 -->
<button @click="clickFn()">@</button>
</div>
new Vue({
el: "#app",
methods: {
clickFn() {
alert("Vue - 指令 - v-on");
}
}
})
v-for
用於綁定數據,來渲染視圖。
<div id="app">
<ul>
<!--
item:當前下標對應的數據。
index:當前循環的下標。
-->
<li v-for="item,index in list" :key="index">
{{item.name}} - {{item.age}} - {{item.sex}}
</li>
</ul>
</div>
new Vue({
el: "#app",
data: {
list: [
{
name: "張三",
age: 18,
sex: "男"
},
{
name: "小美",
age: 16,
sex: "女"
},
{
name: "大明",
age: 28,
sex: "男"
}
]
}
})
注意事項
v-model
實現表單輸入和數據狀態之間的雙向綁定,通常作用在表單元素上面。
<div id="app">
<h4>message:{{message}}</h4>
<input type="text" name="" v-model="message">
</div>
new Vue({
el: "#app",
data: {
message: "Hello Vue.js"
}
})
雙向數據綁定原理
當綁定的控件value
改變時會自動同步到當前綁定的數據,從而引起視圖更新。
<input v-model="message" />
// 等同於
<input :value="message" @input="message = $event.target.value" />
v-model作用在不同的控件上會拋出不同的監聽事件
- text 和 textarea 元素使用
value
屬性和input
事件。 - checkbox 和 radio 使用
checked
屬性和change
事件。 - select 字段將
value
作爲 prop 並將change
作爲事件。
v-show
通過Boolean
控制元素的顯示或隱藏,原理是通過display
來控制顯示或隱藏。
<div id="app">
<p v-show="isShow">我會被隱藏掉嗎?</p>
</div>
new Vue({
el: "#app",
data: {
isShow: true
}
})
v-if / v-else-if / v-else
可以通過Boolean
控制,也可以通過條件判斷來控制添加或刪除,原理是通過appendChild()
和removeChild()
來控制。
<div id="app">
<p v-if="isShow">我會被隱藏掉嗎?</p>
<p v-if="n == 1">v-if</p>
<p v-else-if="n == 2">v-else-if</p>
<p v-else>v-else</p>
</div>
new Vue({
el: "#app",
data: {
isShow: false,
n: 2
}
})
v-html
綁定當前特性的標籤會進行更新元素的內容textContent
,能夠解析標籤,類似原生innerHTML
。
<div id="app">
<p v-html="message">我會被更新掉</p>
</div>
new Vue({
el: "#app",
data: {
message: "Heelo<strong>加粗標籤會被解析嗎?</strong>"
}
})
v-text
綁定當前特性的標籤會進行更新元素的內容textContent
,但是不解析標籤,類似原生innerText
。
<div id="app">
<p v-text="message">我會被更新掉</p>
</div>
new Vue({
el: "#app",
data: {
message: "Heelo<strong>加粗標籤會被解析嗎?</strong>"
}
})
v-once
只渲染元素和組件一次,隨後的改變將不會在重新渲染。這可以用於優化性能。
<div id="app">
<p v-once>{{n}}</p> <!-- 綁定該特性標籤,只會渲染一次。 -->
<p>{{n}}</p>
<button @click="change()">change</button>
</div>
new Vue({
el: "#app",
data: {
n: 1
},
methods: {
change() {
this.n ++;
}
}
})
v-pre
綁定該特性的標籤會跳過這個元素和它的子元素的編譯過程,會顯示原始的標籤內容,不會渲染data
中的數據。
<div id="app">
<p v-pre>{{我不會被渲染了。}}</p>
</div>
new Vue({
el: "#app",
data: {
pre: "v-pre"
}
})
v-clock
隱藏插值符號,用於網絡阻塞,網絡緩慢時,防止頁面中的插值符號會暴露給用戶。
<style>
[v-cloak] { /* CSS3 屬性選擇器 ,需要配合樣式在完成。*/
display: none;
}
</style>
<div id="app">
<p v-cloak>{{message}}</p>
</div>
new Vue({
el: "#app",
data: {
message: "Hello"
}
})
v-slot
在指定的位置輸出我們的內容。
<div id="app">
<!-- 在組件內部聲明瞭`template`標籤模板,與`<slot/>`組件進行綁定,從而實現`template`內的內容會插入到`child`組件中去。 -->
<child>
<template v-slot:child>
<h3>aaa</h3>
</template>
</child>
</div>
new Vue({
el: "#app",
components: {
child: {
template: `
<div>
<slot name="child"></slot>
</div>
`
}
}
})
自定義指令
除了Vue內置的一些指令,Vue是允許註冊自定義指令的。
-
鉤子函數
<div id="app"> <div v-width="width" v-show="show" v-if="append">{{width}}</div> <!-- 觸發 update 和 componentUpdated 鉤子函數 --> <button @click="width += 10">width +</button> <!-- 觸發 update 和 componentUpdated 鉤子函數 --> <button @click="show = !show">isShow?</button> <!-- 指令綁定的元素刪除時觸發 unbind,添加時觸發 bind 和 inserted 鉤子函數 --> <button @click="append = !append">isAppend?</button> </div>
new Vue({ el: "#app", data: { width: 500, show: true, append: true }, directives: { width: { // 指令第一次綁定到元素時調用,值調用一次。 bind(el, binding) { console.log(el, binding, "bind"); }, // 被綁定元素插入父節點時調用,(在這裏父元素是 div#app).但不保證,父元素已經插入了 DOM 文檔。 inserted(el, binding) { console.log(el, binding, "inserted"); }, // 所在組件的`VNode`更新時調用。 update(el, binding) { console.log(el, binding, "update"); }, // 指令所在組件的 VNode 及其子 VNode 全部更新後調用。 componentUpdated(el, binding) { console.log(el, binding, "componentUpdated"); }, // 指令與元素解綁時調用.只調用一次。 unbind(el, binding) { console.log(el, binding, "unbind"); } } } })
定義局部指令
<div id="app">
<div v-width="wh" v-height="wh" v-background=" 'pink' ">{{wh}} * {{wh}}</div>
<button @click="wh += 10">width +</button>
</div>
new Vue({
el: "#app",
data: {
wh: 100
},
directives: {
width(el, binding) {
el.style.width = binding.value + "px";
},
height(el, binding) {
el.style.height = binding.value + "px";
},
background(el, binding) {
el.style.background = binding.value;
}
}
})
定義全局指令
<!DOCTYPE html>
<html>
<head>
<title>Vue - 指令 - 全局指令</title>
</head>
<body>
<div id="app">
<p v-color=" 'pink' ">自定義指令,改變字體顏色</p>
</div>
<script src="../vue.js"></script>
<script>
// 完整語法
Vue.directive("color", {
bind(el, binding) {
el.style.color = binding.value;
},
inserted() {
},
update() {
},
componentUpdated() {
},
unbind() {
}
})
// 簡寫語法
Vue.directive("color", (el, binding) => {
el.style.color = binding.value;
})
new Vue({
el: "#app"
})
</script>
</body>
</html>