在数据绑定中,最常见的两个需求就是元素的样式名称 class 和内联样式 style 的动态绑定,它们也是 HTML的属性,因此可以使用 v-bind 指令。我们只需要用 v-bind计算出表达式最终的字符串就可以,不过有时候表达式的逻辑较复杂,使用字符串拼接方法较难阅读和维护,所以 Vue.js 增强了对 class 和 style 的绑定。
1、 了解bind指令
链接的 href 属性和图片的 src属性都被动态设置了,当数据变化时,就会重新渲染。
<div id="app">
<a v-bind:href="url">我是百度</a>
<img :src="imgUrl" alt="">
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
<script>
var app = new Vue({
el: '#app',
data: {
url: "https://www.baidu.com",
imgUrl: "https://www.baidu.com/img/fddong_e2dd633ee46695630e60156c91cda80a.gif"
}
})
</script>
2、绑定 class 的几种方式
(1) 对象语法
给 v-bind:class 设置一个对象,可以动态地切换 class 值对应true ,false。其中注意的是绑定class对象语法:对象的键是类名,值是布尔值。
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
.divStyle {
background-color: red;
width: 100px;
height: 100px;
}
</style>
</head>
<body>
<div id="app">
绑定class对象语法:对象的键是类名,值是布尔值
<div :class="{divStyle:isActive}"></div>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
<script>
var app = new Vue({
el: "#app",
data: {
isActive: true
}
})
</script>
</body>
示例如下:需求点击输入按钮切换红、蓝
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
.bntBackgroundRed {
background-color: red;
}
.bntBackgroundBlue {
background-color: blue;
}
</style>
</head>
<body>
<div id="app">
<input type="button" value="点击我切换红、蓝" :class="{bntBackgroundRed:isBack,bntBackgroundBlue:!isBack}"
v-on:click="changeColor">
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
<script>
var app = new Vue({
el: "#app",
data: {
isBack: true
},
methods: {
changeColor: function () {
this.isBack = !this.isBack;
}
}
})
</script>
</body>
当 class 的表达式过长或逻辑复杂时,还可以绑定一个计算属性,这是一种很友好和常见的用法,一般当条件多于两个时都可以使用 data或computed
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
.active {
background-color: red;
width: 100px;
height: 100px;
}
</style>
</head>
<body>
<div id="app">
<div :class="classNames"></div>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
<script>
var app = new Vue({
el: "#app",
data: {
isActive:true,
isBorder:false
},
computed:{
classNames:function(){
return{
active: this.isActive && !this.isBorder //active为类名
}
}
}
})
</script>
</body>
(2) 数组语法
当需要应用多个 class 时, 可以使用数组语法 , 给:class 绑定一个数组。 绑定class数组语法:数组中的成员直接对应类名。
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
.active {
background-color: black;
width: 100px;
height: 100px;
}
.error{
border:10px solid red;
}
</style>
</head>
<body>
<div id="app">
绑定class数组语法:数组中的成员直接对应类名
<div :class="[activeClass,errorClass]"></div>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
<script>
var app = new Vue({
el: "#app",
data: {
activeClass:'active',
errorClass:'error'
},
})
</script>
</body>
数组和对象混用实例,第一个成员是对象,第二个成员是数组成员如下:
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
.active {
background-color: black;
width: 100px;
height: 100px;
}
.error{
border:10px solid red;
}
</style>
</head>
<body>
<div id="app">
数组和对象混用,第一个成员是对象,第二个成员是数组成员
<div :class="[{active:isActive},errorClass]"></div>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
<script>
var app = new Vue({
el: "#app",
data: {
isActive:false,
errorClass:'error'
},
})
</script>
</body>
3、绑定内联样式
(1)、对象语法
绑定内联样式:键代表style属性,值就代表属性所代表的值
<div id="app">
<div :style="{'color':color,'fontSize':fontSize+'px'}">我是男孩子</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
<script>
var app = new Vue({
el: "#app",
data: {
color: 'red',
fontSize: 16
},
})
</script>
注意 : css 属性名称使用驼峰命名( came!Case )或短横分隔命名( kebabcase)。简单一点就是:Vue中只要是大写字母,就会给你转换成“-加小写”。
1、fontSize:font-size
2、adDFASF:ad-d-f-a-s-f
(2)、数组语法:这种用法基本不用,原理和class用法类似。
1、应用多个样式对象时 , 可以使用数组语法 :在实际业务中,style 的数组语法并不常用 , 因为往往可以写在一个对象里面 : 而较为常用的应当是计算属性
2、使用 :style 时, Vue .js 会自动给特殊的 css 属性名称增加前缀, 比如 transform 。无需再加前缀属性!!!