操作元素的 class 列表和内联样式是数据绑定的一个常见需求。
因为它们都是 attribute,所以我们可以用 v-bind
处理它们:只需要通过表达式计算出字符串结果即可。
不过,字符串拼接麻烦且易错。因此,在将 v-bind
用于 class
和 style
时,Vue.js 做了专门的增强。表达式结果的类型除了字符串之外,还可以是对象或数组。
【对象语法】
我们可以传给 v-bind:class
一个对象,以动态地切换 class:
Title
HTMLClass 绑定
上面的语法表示 active
这个 class 存在与否将取决于数据 property isActive
的 truthiness【真值】。
浏览器效果
也可以在对象中传入更多字段来动态切换多个 class。此外,v-bind:class
指令也可以与普通的 class 属性共存。
当有如下模板:
当 isActive
或者 hasError
变化时,class 列表将相应地更新。
这样子写的话,有点麻烦,绑定的数据对象都内联式的定义在模板里了。
【其实不必【直接封装成一个对象】】
Title
渲染效果
也可以在这里绑定一个返回对象的计算属性。【这是一个常用且强大的模式】
Title
渲染效果
【数组语法】
我们可以把一个数组传给 v-bind:class
,以应用一个 class 列表:
Title
渲染结果
如果想根据条件切换列表中的 class,可以用三元表达式:
Title
这样写将始终添加 errorClass
,但是只有在 isActive
是 truthy【真】时才添加 activeClass
。
不过,当有多个条件 class 时这样写有些繁琐。所以在数组语法中也可以使用对象语法:
【用在组件上】
当在一个自定义组件上使用 class
property 时,这些 class 将被添加到该组件的根元素上面。
这个元素上已经存在的 class 不会被覆盖。
[举个栗子]
声明组件:
Vue.component('my-component', {template: 'Hi
>'
})
在使用它的时候添加一些class :
最终的渲染结果
嗯,添加到组件的根元素上了。
对于带数据绑定 class 也同样适用:
当 isActive
为 truthy【真】时,HTML 将被渲染成为:
Hi