前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >21 vue 组件中 Class 的绑定

21 vue 组件中 Class 的绑定

作者头像
LIYI
发布2020-02-13 11:55:40
1.6K0
发布2020-02-13 11:55:40
举报
文章被收录于专栏:艺述论专栏
代码语言:javascript
复制
目录

一般绑定
对象绑定
数组绑定
父子组件中类名覆盖的情况
小结

一般绑定

对于样式类的绑定,使用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 的绑定
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-01-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 艺述论 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一般绑定
  • 对象绑定
  • 数组绑定
  • 父子组件中类名覆盖的情况
  • 小结
  • 源码
  • 相关阅读
相关产品与服务
腾讯云小微
腾讯云小微,是一套腾讯云的智能服务系统,也是一个智能服务开放平台,接入小微的硬件可以快速具备听觉和视觉感知能力,帮助智能硬件厂商实现语音人机互动和音视频服务能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档