由于class与style均为样式属性,因此可以通过v-bind指令进行属性绑定,属性表达式结果的类型可以是对象或数组。
1.对象绑定
例如:点击div时,即可改变actived的样式,实现切换文本颜色功能。
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document Title</title>
<style>
.actived {
color: red;
}
.mylink{
cursor: pointer;
}
</style>
</head>
<body>
<div id="app">
<div @click="handleClick" class="mylink" :class="{actived:changeStyle}">Hello World</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
let vm = new Vue({
el: '#app',
data: {
changeStyle: false
},
methods: {
handleClick: function () {
this.changeStyle = !this.changeStyle;
}
}
})
</script>
</body>
</html>
2.数组绑定 上例也可以使用数组绑定,在样式的数组中定义了两个变量,分别是active和current,并将其放入data中。
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document Title</title>
<style>
.actived {
color: red;
}
.mylink {
cursor: pointer;
}
</style>
</head>
<body>
<div id="app">
<div @click="handleClick" :class="[active,link]">Hello World</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
let vm = new Vue({
el: '#app',
data: {
active: '',
link: 'mylink'
},
methods: {
handleClick: function () {
this.active = this.active === 'actived' ? '' : 'actived';
}
}
})
</script>
</body>
</html>
将active中的属性名置为空,link的属性名设为mylink,div上此时只有一个样式名link。当我执行点击操作时,会对active中的属性名进行判断,由于目前的属性名为空,因此会将actived样式添加到div上。
3.样式绑定综合实例
样式绑定实现选择支付方式效果。
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document Title</title>
<style>
#app{
width: 450px;
border-top: 1px solid #f5f5f5;
}
.active{
background: url("http://img.simoniu.com/check.png") no-repeat right center;
background-size: 30px 30px;
}
#paybox{
width: 100%;
background-color: white;
padding:0 10px;
margin-bottom: 20px;
}
.paylist{
width: 150px;
}
#paybox img{
width: 28px;
margin-left: 20px;
}
</style>
</head>
<body>
<div id="app">
<div>
<div>支付方式</div>
<div id="paybox">
<div class="paylist" v-for="(pay,index) in payList" :key="index" :class="{active:pay.active}"
@click="selectPay(index)"><span>{{pay.name}}</span><img :src="''+pay.logo" alt=""/></div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
let vm = new Vue({
el: '#app',
data: {
payList: [
{
"name": "支付宝",
"logo": "http://img.simoniu.com/alipay.jpg",
"active": true
},
{
"name": "微信",
"logo": "http://img.simoniu.com/weixin.jpg",
"active": false
},
{
"name": "银联",
"logo": "http://img.simoniu.com/unipay.jpg",
"active": false
}
]
},
methods: {
selectPay: function (index) {
for (let i = 0; i < this.payList.length; i++) {
this.payList[i].active = false;
}
this.payList[index].active = true;
}
}
})
</script>
</body>
</html>
运行效果:
