前文
在传统网页开发中,我们可以使用class和style
但是在vue中,我们不仅可以使用class和style
更可以通过bing函数,也就是:来动态设置class和style
这里有多种写法,我们可以浅尝截止一下
对象语法
<div :class="{ active: isActive }"></div>
这里isActive变量的真假来控制active的class名的存在与不存在
:class与class可以共存
<div
class="static"
:class="{ active: isActive, 'text-danger': hasError }"
></div>
期期中isActive以及hasError控制类名的存在与不存在
假设isActive为真,而hasError为假
则渲染的结果为
<div class="static active"></div>
当数据的变化发生改变,则会相应的进行动态更新
我们也可以:bind上一个对象,对象包含上述的内容
<div :class="classObject"></div>
data() {
return {
classObject: {
active: true,
'text-danger': false
}
}
}
同理,只要符合数据格式的响应式对象即可,我们也可以绑定一个计算属性
<div :class="classObject"></div>
data() {
return {
isActive: true,
error: null
}
},
computed: {
classObject() {
return {
active: this.isActive && !this.error,
'text-danger': this.error && this.error.type === 'fatal'
}
}
}
数组语法
我们除了给:class绑定一个对象,也可以绑定一个数组,如
<div :class="[activeClass, errorClass]"></div>
data() {
return {
activeClass: 'active',
errorClass: 'text-danger'
}
}
则绑定的结果为
<div class="active text-danger"></div>
我们也可以在数组中使用三元表达式,来动态的计算数组中返回的数据变量或字符串
<div :class="[isActive ? activeClass : '', errorClass]"></div>
该表达式errorClass始终存在,而activeClass根据isActive的值来判断
我们也可以在数组中使用对象语法,但是这种我们通常不会使用
<div :class="[{ active: isActive }, errorClass]"></div>
在组件上使用
假如我们声明了一个组件
const app = Vue.createApp({})
app.component('my-component', {
template: `<p class="foo bar">Hi!</p>`
})
同时在调用该组件的父组件添加了一个动态的class
<div id="app">
<my-component class="baz boo"></my-component>
</div>
则组件的class与组件自身的class会融合在一起
在Vue3中,可以声明多个根节点,当存在多个根节点的时候,使用$attrs属性来进行融合父组件设置的class
<div id="app">
<my-component class="baz"></my-component>
</div>
const app = Vue.createApp({})
app.component('my-component', {
template: `
<p :class="$attrs.class">Hi!</p>
<span>This is a child component</span>
`
})
总结
我们可以对动态class设置一个对象,或一个数组
如果是对象,类名在前,真假在后,如果是数组,则可以使用三元表达式
数组和对象可以结合
内联样式
CSS属性名可以使用驼峰式,如camelCase或短横线分割kebab-case,style动态跟动态class的用法基本一致
<div :style="{ color: activeColor, fontSize: fontSize + 'px' }"></div>
data() {
return {
activeColor: 'red',
fontSize: 30
}
}
我们也可以直接绑定一个样式对象
<div :style="styleObject"></div>
data() {
return {
styleObject: {
color: 'red',
fontSize: '13px'
}
}
}
同理也可以使用计算属性
数组语法
同理,我们也可以设置多个样式对象到同一个数组上
<div :style="[baseStyles, overridingStyles]"></div>
自动添加前缀
css具有很多实验性的特性,浏览器厂商为了兼容这些特性,同时不与其他浏览器冲突
所以经常会添加一个特殊的前缀
如transition,有-moz-,-ms-,-webkit-,等等
一开始一个厂商会具有一个前缀,而后来为了抢占市场分量,开始互相兼容对象前缀
如果我们正常写css代码,我们需要自己写前缀
也可以使用scss编译,自动添加前缀
而在vue中
vue将会自动侦测并且添加响应的前缀,vue会在运行时检测哪些样式的属性是被浏览器所支持的
如果不支持某个属性,会通过多次尝试来找到支持他的前缀
(这里个人并没有特别理解,大概翻了一下源码也没翻到)
感觉不像是autoprefix,而是根据js代码检测特定前缀来进行处理的?
多重值
可以在style绑定的过程中,为属性提供一个包含多个值的数组,提供多个带前缀的值,例如
<div :style="{ display: ['-webkit-box', '-ms-flexbox', 'flex'] }"></div>
这样只会渲染数组中最后一个被浏览器支持的值。
结语
我们只需要记住绑定动态class以及style的时候可以是数组形式,也可以是对象形式,会自动添加前缀
需要的时候查什么即可。
撒花~