前言
通過(guò)上一章的學(xué)習(xí)vue學(xué)習(xí)筆記(二)vue的生命周期和鉤子函數(shù),我們已經(jīng)更近一步的知道了關(guān)于vue的一些知識(shí),本篇博客將進(jìn)一步探討vue其它方面的內(nèi)容,vue中關(guān)于class和style綁定,關(guān)于class和style我們并不陌生,這個(gè)在學(xué)習(xí)css的時(shí)候就是家常便飯了,操作元素的 class 列表和內(nèi)聯(lián)樣式是數(shù)據(jù)綁定的一個(gè)常見(jiàn)需求。因?yàn)樗鼈兌际菍傩?,所以我們可以?v-bind 處理它們:只需要通過(guò)表達(dá)式計(jì)算出字符串結(jié)果即可。不過(guò),字符串拼接麻煩且易錯(cuò)。因此,在將 v-bind 用于 class 和 style 時(shí),Vue.js 做了專門(mén)的增強(qiáng)。表達(dá)式結(jié)果的類型除了字符串之外,還可以是對(duì)象或數(shù)組,所以本章將帶你了解vue中如何綁定class和style。
本章目標(biāo)
- 學(xué)會(huì)使用綁定class的對(duì)象語(yǔ)法
- 學(xué)會(huì)使用綁定class的數(shù)組語(yǔ)法
- 學(xué)會(huì)使用綁定style的對(duì)象語(yǔ)法
- 學(xué)會(huì)使用綁定style的數(shù)組語(yǔ)法
class的對(duì)象語(yǔ)法
(1)直接寫(xiě)class屬性
(1)可以傳給 v-bind:class 一個(gè)對(duì)象,以動(dòng)態(tài)地切換 class
<div v-bind:class="{ active: isActive }"></div>
上面的語(yǔ)法表示 active 這個(gè) class 存在與否將取決于數(shù)據(jù)屬性 isActive 的 truthy,如果為truthy則使用active這個(gè)類,如果為false則不使用active這個(gè)類。
注意:在 javascript 中,truthy(真值)指的是在布爾值上下文中,轉(zhuǎn)換后的值為真的值。所有值都是真值,除非它們被定義為 假值(即除 false、0、""、null、undefined 和 NaN 以外皆為真值。
JavaScript 中的真值示例如下(將被轉(zhuǎn)換為 true,if 后的代碼段將被執(zhí)行)
if (true)
if ({})
if ([])
if (42)
if ("foo")
if (new Date())
if (-42)
if (3.14)
if (-3.14)
if (Infinity)
if (-Infinity)
(2)在對(duì)象中傳入更多屬性來(lái)動(dòng)態(tài)切換多個(gè) class。此外,v-bind:class 指令也可以與普通的 class 屬性共存。
<div
class="static"
v-bind:class="{ active: isActive, 'text-danger': hasError }"
></div>
data中的數(shù)據(jù)
data: {
isActive: true,
hasError: false
}
結(jié)果:
<div class="static active"></div>
當(dāng) isActive 或者 hasError 變化時(shí),class 列表將相應(yīng)地更新。例如,如果 hasError 的值為 true,class 列表將變?yōu)?"static active text-danger"
示例:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style type="text/css">
div{
width: 100px;
height: 100px;
}
.red{
background: red;
}
.yellow{
background: yellow;
}
.border{
border: 1px solid black;
}
</style>
</head>
<body>
<div id="app">
<div class="border" :class="{red:red}"></div>
</div>
<script src="../../js/vue.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">
const vm=new Vue({
el:'#app',
data:{
red:true, //當(dāng)red的truthy時(shí),這個(gè)類才會(huì)生效
}
})
</script>
</body>
</html>
結(jié)果:

(2)class作為對(duì)象處理
當(dāng)我們需要在一個(gè)元素上綁定很多個(gè)類的時(shí)候,我們就可能需要寫(xiě)很長(zhǎng)很長(zhǎng)的代碼,這樣的代碼對(duì)于我們今后的維護(hù)是十分糟糕的,所以為了解決這個(gè)問(wèn)題,我們可以將需要添加的類抽取出來(lái),作為一個(gè)對(duì)象處理。
示例:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>class作為對(duì)象處理</title>
<style type="text/css">
div{
width: 100px;
height: 100px;
}
.red{
background: red;
}
.yellow{
background: yellow;
}
.border{
border: 1px solid black;
}
.radius{
border-radius: 50%;
}
</style>
</head>
<body>
<div id="app">
<div :class="classObj"></div>
</div>
<script src="../../js/vue.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">
const vm=new Vue({
el:'#app',
data:{
red:true, //當(dāng)red的true時(shí),這個(gè)類才會(huì)生效
classObj:{
red:true,
border:true,
radius:true
}
}
})
</script>
</body>
</html>
結(jié)果:

可以看到,我們將需要添加的類作為一個(gè)對(duì)象,然后綁定,也是一樣的效果。
(3)class作為計(jì)算屬性處理
class作為計(jì)算屬性,這個(gè)的話就比較厲害了,這里可以進(jìn)行邏輯處理等等
示例:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style type="text/css">
div{
width: 100px;
height: 100px;
}
.red{
background: red;
}
.yellow{
background: yellow;
}
</style>
</head>
<body>
<div id="app">
<div :class="computeClass"></div>
</div>
<script src="../../js/vue.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">
const vm=new Vue({
el:'#app',
data:{
red:true,
yellow:true
},
computed:{
computeClass(){
return {
red:this.red&&this.yellow
}
}
}
})
</script>
</body>
</html>
結(jié)果

class的數(shù)組語(yǔ)法
(1)直接綁定在元素上
我們可以把一個(gè)數(shù)組傳給 v-bind:class,以應(yīng)用一個(gè) class 列表
<div v-bind:class="[activeClass, errorClass]"></div>
data中的數(shù)據(jù)
data: {
activeClass: 'active',
errorClass: 'text-danger'
}
結(jié)果:
<div class="active text-danger"></div>
示例:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style type="text/css">
div{
width: 100px;
height: 100px;
}
.green{
background: green;
}
.border{
border: 1px solid black;
}
</style>
</head>
<body>
<div id="app">
<div :class="[green,border]"></div>
</div>
<script src="../../js/vue.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">
const vm=new Vue({
el:'#app',
data:{
green:'green',
border:'border'
}
})
</script>
</body>
</html>
結(jié)果:

(2)使用三元表達(dá)式綁定
如果你也想根據(jù)條件切換列表中的 class,可以用三元表達(dá)式
<div v-bind:class="[isActive ? activeClass : '', errorClass]"></div>
示例:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style type="text/css">
div{
width: 200px;
height: 200px;
}
.red{
background: red;
}
.border{
border: 1px solid green;
}
.green{
background: green;
}
</style>
</head>
<body>
<div id="app">
<div :class="[isActive? red: green]"></div>
</div>
<script src="../../js/vue.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">
const vm=new Vue({
el:'#app',
data:{
isActive:false,
red:"red",
green:'green'
}
})
</script>
</body>
</html>
結(jié)果:

(3)數(shù)組和對(duì)象
當(dāng)有多個(gè)條件 class 時(shí)這樣寫(xiě)有些繁瑣。所以在數(shù)組語(yǔ)法中也可以使用對(duì)象語(yǔ)法
<div v-bind:class="[{ active: isActive }, errorClass]"></div>
示例:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style type="text/css">
div{
width: 300px;
height: 300px;
}
.red{
background: red;
}
.radius{
border-radius: 50px;
}
</style>
</head>
<body>
<div id="app">
<div :class="[{red:red},radius]"></div>
</div>
<script src="../../js/vue.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">
const vm=new Vue({
el:'#app',
data:{
red:true,
radius:'radius'
}
})
</script>
</body>
</html>
結(jié)果:

style的對(duì)象語(yǔ)法
(1)直接綁定style
v-bind:style 的對(duì)象語(yǔ)法十分直觀——看著非常像 CSS,但其實(shí)是一個(gè) JavaScript 對(duì)象。CSS 屬性名可以用駝峰式 (camelCase) 或短橫線分隔 (kebab-case,記得用引號(hào)括起來(lái)) 來(lái)命名:
<div v-bind:style="{ color: activeColor, fontSize: fontSize + 'px' }"></div>
data中的數(shù)據(jù)
data: {
activeColor: 'red',
fontSize: 30
}
示例:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<div id="app">
<div :style="{fontSize:fontSize+'px',color:color}">你好</div>
</div>
<script src="../../js/vue.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">
const vm=new Vue({
el:'#app',
data:{
color:'red',
fontSize:30
}
})
</script>
</body>
</html>
結(jié)果:

(2)用對(duì)象綁定style
<div v-bind:style="styleObject"></div>
data中的數(shù)據(jù)
data: {
styleObject: {
color: 'red',
fontSize: '13px'
}
}
示例:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<div id="app">
<div :style="styleObj">歡迎學(xué)習(xí)vue綁定style</div>
</div>
<script src="../../js/vue.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">
const vm=new Vue({
el:'#app',
data:{
styleObj:{
color:'red',
fontSize:'30px',
fontWeight:'bold'
}
}
})
</script>
</body>
</html>
結(jié)果:

(3)用計(jì)算屬性綁定style
示例:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<div id="app">
<div :style="computeStyle">你好</div>
</div>
<script src="../../js/vue.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">
const vm=new Vue({
el:'#app',
data:{
bl:false
},
computed:{
computeStyle(){
return{
color:this.bl?'red':'blue',
fontSize:this.bl?'20px':'50px',
fontWeight:this.bl?'bold':'normal'
}
}
}
})
</script>
</body>
</html>
結(jié)果:

style的數(shù)組語(yǔ)法
(1)直接綁定在元素上
v-bind:style 的數(shù)組語(yǔ)法可以將多個(gè)樣式對(duì)象應(yīng)用到同一個(gè)元素上
<div v-bind:style="[baseStyles, overridingStyles]"></div>
示例:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style type="text/css">
div{
width: 100px;
height: 100px;
display: inline-block;
background: green;
}
</style>
</head>
<body>
<div id="app">
<div :style="[styleObj1,styleObj2]">你好</div>
</div>
<script src="../../js/vue.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">
const vm=new Vue({
el:'#app',
data:{
styleObj1:{
color:'red',
},
styleObj2:{
textAlign:'center',
lineHeight:'100px'
}
}
})
</script>
</body>
</html>
結(jié)果:

(2)多重值問(wèn)題
style 綁定中的屬性提供一個(gè)包含多個(gè)值的數(shù)組,常用于提供多個(gè)帶前綴的值,例如:
<div :style="{ display: ['-webkit-box', '-ms-flexbox', 'flex'] }"></div>
示例:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style type="text/css">
div{
width: 100px;
height: 100px;
background: red;
}
</style>
</head>
<body>
<div id="app">
<div :style="{ display: ['-webkit-box', '-ms-flexbox', 'flex'] }"></div>
</div>
<script src="../../js/vue.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">
const vm=new Vue({
el:'#app',
})
</script>
</body>
</html>
結(jié)果:
