layout: post title: vue动态绑定样式的几种方法 tags: [vue] —
今天看到一篇文章,里面出现了自己看不懂的css绑定方式,于是去vue官方了解了一下样式绑定方式,顺便写下这篇总结
Vue动态绑定CSS
如果我们想通过vue给对应的dom元素添加css样式,可以通过以下几种方式:
绑定类名方式
1. 潜意识写法
首先,我们知道,如果想将js代码里面的东西渲染到dom元素属性上面,需用v-bind的方式绑定。 因此,我们首先想到的是下面这个写法:
<div id="app" >
<div v-bind:class="myclass"></div>
</div>
new Vue({
el:"#app",
data:{
myclass:"red"
}
})
生成的结构是下面这样子
<div class="red"></div>
2. 通过对象绑定
除了上面的写法,我们还可以这样写
<div id="app" >
<div v-bind:class="{red : flag,active:false}"></div>
</div>
new Vue({
el:"#app",
data:{
flag:true,
}
})
生成的结构也是下面这样子
<div class="red"></div>
请注意两种写法的不同。第一种是通过v-bind把data里面的值拿出来,第二种是把class绑定一个对象,通过这个对象里面的属性true/false来确定要渲染。
3. 通过函数方法返回
当然在这里我们还可以通过函数方法计算返回对象属性:
<div v-bind:class="classObject"></div>
data: {
isActive: true,
error: null
},
computed: {
classObject: function () {
return {
active: this.isActive && !this.error,
}
}
}
生成的结构也是下面这样子
<div class="active "></div>
4. 利用数组的方式
我们也可以利用数组的方式添加多个样式 例如:
<div v-bind:class="[active, oactive]"></div>
data:{
active:"red",
oactive:"text-focus"
}
生成的结构也是下面这样子
<div class="red text-focus"></div>
# 请注意,如果不加上左右两个中括号“[…]”,只会绑定第一个样式。 比如:
<div v-bind:class="active, oactive"></div>
data:{
active:"red",
oactive:"text-focus"
}
生成的结构也是下面这样子
<div class="red"></div>
绑定内联样式
大致上和我们绑定到类名的方式差不多
从data里面直接取出来
<div v-bind:style="{ color: activeColor, fontSize: fontSize + 'px' }"></div>
data: {
activeColor: 'red',
fontSize: 30
}
从一个对象取出来
<div v-bind:style="styleObject"></div>
data: {
styleObject: {
color: 'red',
fontSize: '13px'
}
}
从多个对象取出来
<div v-bind:style="[baseStyles, overridingStyles]"></div>
data: {
baseStyles: {
color: 'red',
fontSize: '13px'
},
overridingStyles{
background:'red'
}
}
vue对样式的兼容还做了个很不错的地方
官方文档只用一句话说清:
当 v-bind:style 使用需要添加浏览器引擎前缀的 CSS 属性时,如 transform,Vue.js 会自动侦测并添加相应的前缀。
意思是说,通过style添加的内联样式,可以不用写浏览器引擎的前缀,比如-webkit-trasform,vue会自己检测并自动添加上去
#
在组件上绑定样式
其实也是和在dom元素上面绑定样式差不多。来看官方文档里面的写法:
Vue.component('my-component', {
template: '<p class="foo bar">Hi</p>'
})
<my-component class="baz boo"></my-component>
结果是这样子的
<p class="foo bar baz boo">Hi</p>
# 对于带数据绑定 class 也同样适用:
<my-component v-bind:class="{ active: isActive }"></my-component>
当 isActive 为 truthy[1] 时,HTML 将被渲染成为:
<p class="foo bar active">Hi</p>
小总结:
虽说vue给我们提供了很多种样式绑定的方式,看上去实际自己似乎并不需要这么多,但有时候利用这些奇巧淫技,说不定还能为我们节省很多时间