目录
一般绑定
对象绑定
数组绑定
父子组件中类名覆盖的情况
小结
一般绑定
对于样式类的绑定,使用v-bind就能满足需求,但vue为class的绑定作了特别的优化。
如果一个元素上有'active','text-danger'两个class,一般v-bind默认这样写:
代码语言:javascript复制<!-- 一般语法 -->
<div v-bind:class="(classObject['text-danger'] ? 'text-danger ':' ') (classObject.active ? 'active ':' ')">对象语法1</div>
渲染出来是这样的:
代码语言:javascript复制<div data-v-166afc47="" class="text-danger active ">对象语法1</div>
当classObject的属性均为true时,两个class都有。
但是这样的拼接语法很容易出错。所以vue分别使用对象语法与数组语法加强了class的绑定。
对象绑定
以下这三种写法,都是对象绑定的语法:
代码语言:javascript复制<!-- 对象语法 -->
<div v-bind:class="{ active: classObject.active, 'text-danger': classObject['text-danger'] }">对象语法1</div>
<div v-bind:class="classObject">对象语法2</div>
<div v-bind:class="classObject2">对象语法3</div>
...
classObject: {
active: true,
'text-danger': true
},
computed: {
classObject2: function () {
return {
active: this.classObject.active,
'text-danger': this.classObject['text-danger']
}
},
}
三种写法渲染出来的结果是一样的:
第一种是在表达式中拼合对象,对象的键是class,值是布尔,控制class的启用与否。
第二种是直接绑定对象,第三种是使用计算属性。三种对象的格式都是一样的,键名为class,键值为是否显示。
数组绑定
在class属性上,除了使用对象,还可以使用一个数组。以下两个是数组绑定的语法:
代码语言:javascript复制<!-- 数组语法 -->
<div v-bind:class="[classObject3[0], classObject3[1]]">数组语法1</div>
<div v-bind:class="classObject3">数组语法2</div>
渲染结果为:
无论是直接使用一个数组,还是在属性表达式中拼合一个数组,结果都是一样的。数组中有哪些class,哪些class便显示。
父子组件中类名覆盖的情况
有一个情况,如果在子组件的根元素上,与父组件中子组件的定义上,使用了相同的class名称,会出现什么情况?
例如,子组件:
代码语言:javascript复制<div v-bind:class="{ active1: true, active3: true }">
...
<style scoped>
.active1{
color:red;
}
</style>
父组件:
代码语言:javascript复制<D21ClassBinding v-bind:class="{ active1: true, active2: true }"></D21ClassBinding>
...
<style scoped>
.active1{
color:blue;
}
</style>
实际的的渲染结果是,四个class都会被渲染到组件的根元素上:
但是,是子组件中的class先被渲染,其实是父组件,所以当样式有冲突时,运行效果字是蓝色的,而不是红色的:
小结
如果一个组件可能根据运行时的条件不同,会有多个class,这时候为其声明一个class数组不失为一个优雅的选择。
但是,在大多数快速开发的情况下,如果为每个组件的class都要声明一个对象或者数组,这在开发中是有点麻烦的。
简单的做法,就是使用对象绑定的语法,把可能的class都写在属性表达式中,使用js表达式或计算属性或data变量控制每个class的出场与否,这样最省事。
源码
https://git.code.tencent.com/shiqiaomarong/vue-go-rapiddev-example/tags/v20200117
相关阅读
- 1 如何选择一个 vue ui 框架?
- 2 梳理 50 年人机交互界面发展史,得出这个规律,开发框架的选择不再迷茫
- 3 vue 开发常用工具及配置一
- 4 vue 开发常用工具及配置二
- 5 vue 开发常用工具及配置三
- 6 vue 开发常用工具及配置四:推荐一个 mock 工具
- 7 vue 开发常用工具及配置五:hash 与缓存控制
- 8 vue 开发常用工具及配置六:认识各种 loader
- 9 vue 开发常用工具及配置七:处理资源加载问题
- 10 vue 开发常用工具及配置八:scoped CSS 模块化
- 11 css 基本功:引入方式及选择器相关
- 12 手写配置启动一个 vue2 项目
- 13 声明式渲染与 data 函数
- 14 上线后不想让人看到源码怎么做?
- 15 v-if 条件渲染与 v-for 列表渲染
- 16 处理表单数据与父子组件之间的数据交换
- 17 vue 组件化基础
- 18 vue 实例及其双向绑定的实现原理
- 19 vue 模板语法及简要实现原理
- 20 vue计算属性和侦听器
- 21 vue 组件中 Class 的绑定