Vue 中使用 CSS Modules优雅方法


Posted in Javascript onApril 09, 2018

CSS Modules:局部作用域 & 模块化

CSS Modules 为每一个局部类赋予全局唯一的类名,这样组件样式间就不会相互影响了。如:

/* button.css */
.button {
 font-size: 16px;
}
.mini {
 font-size: 12px;
}

它会被转换为类似这样:

/* button.css */
.button__button--d8fj3 {
 font-size: 16px;
}
.button__mini--f90jc {
 font-size: 12px;
}

当导入一个 CSS 模块文件时,它会将局部类名到全局类名的映射对象提供给我们。就像这样:

import styles from './button.css'
// styles = {
// button: 'button__button--d8fj3',
// mini: 'button__mini--f90jc'
// }
element.innerHTML = '<button class="' + styles.button + ' ' + styles.mini + '" />'

vue-css-modules :简化类名映射

下面是一个使用了 CSS Modules 的按钮组件:

<template>
 <button :class="{
 'global-button-class-name': true,
 [styles.button]: true,
 [styles.mini]: mini
 }">点我</button>
</template>
<script>
 import styles from './button.css'

 export default {
 props: { mini: Boolean },
 data: () => ({ styles })
 }
</script>

的确,CSS Modules 对于 Vue 组件是一个不错的选择。但也存在以下几点不足:

  • 你必须在 data 中传入 styles
  • 你必须使用 styles.localClassName 导入全局类名
  • 如果有其他全局类名,你必须将它们放在一起
  • 如果要和组件的属性值绑定,就算局部类名和属性名一样,也要显式指定

对于上面的按钮组件,使用 vue-css-modules 后:

<template>
 <button
 class="global-button-class-name"
 styleName="button :mini">
 点我
 </button>
</template>
<script>
 import CSSModules from 'vue-css-modules'
 import styles from './button.css'

 export default {
 mixins: [CSSModules(styles)],
 props: { mini: Boolean }
 }
</script>

现在:

  • 你不必在 data 中传入 styles ,但得在 mixins 中传入 styles :full_moon_with_face:
  • 你可以跟 styles.localClassName 说拜拜了
  • 将局部类名放在 styleName 属性,全局类名放在 class 属性,规整了许多
  • 局部类名绑定组件同名属性,只需在其前面加上 : 修饰符

修饰符

@button

<button styleName="@button">按钮</button>

这等同于:

<button styleName="button" data-component-button="true">按钮</button>

这让你能在外部重置组件的样式:

.form [data-component-button] {
 font-size: 20px;
}

$type

<button styleName="$type">按钮</button>

这等同于:

<button :styleName="type">按钮</button>

:mini

<button styleName=":mini">按钮</button>

这等同于:

<button :styleName="mini ? 'mini' : ''">按钮</button>
disabled=isDisabled
<button styleName="disabled=isDisabled">按钮</button>

这等同于:

<button :styleName="isDisabled ? 'disabled' : ''">按钮</button>

使用方法

在 Vue 模板中使用

引入模板外部的 CSS 模块

<template>
 <button
 class="global-button-class-name"
 styleName="button :mini">
 点我
 </button>
</template>
<script>
 import CSSModules from 'vue-css-modules'
 import styles from './button.css'
 export default {
 mixins: [CSSModules(styles)],
 props: { mini: Boolean }
 }
</script>

使用模板内部的 CSS 模块

<template>
 <button
 class="global-button-class-name"
 styleName="button :mini">
 点我
 </button>
</template>
<script>
 import CSSModules from 'vue-css-modules'

 export default {
 mixins: [CSSModules()],
 props: { mini: Boolean }
 }
</script>
<style module>
 .button {
 font-size: 16px;
 }
 .mini {
 font-size: 12px;
 }
</style>

在 Vue JSX 中使用

import CSSModules from 'vue-css-modules'
import styles from './button.css'
export default {
 mixins: [CSSModules(styles)],
 props: { mini: Boolean },
 render() {
 return (
  <button styleName="@button :mini">点我</button>
 )
 }
}

在 Vue 渲染函数中使用

import CSSModules from 'vue-css-modules'
import styles from './button.css'

export default {
 mixins: [CSSModules(styles)],
 props: { mini: Boolean },
 render(h) {
 return h('button', {
  styleName: '@button :mini'
 }, '点我')
 }
}

总结

以上所述是小编给大家介绍的Vue 中使用 CSS Modules优雅方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
推荐40个简单的 jQuery 导航插件和教程(下篇)
Sep 14 Javascript
jquery ajax应用中iframe自适应高度问题解决方法
Apr 12 Javascript
Javascript中封装window.open解决不兼容问题
Sep 28 Javascript
angularJS中router的使用指南
Feb 09 Javascript
JavaScript之WebSocket技术详解
Nov 18 Javascript
vue滚动轴插件better-scroll使用详解
Oct 17 Javascript
JS原型继承四步曲及原型继承图一览
Nov 28 Javascript
Angular4学习之Angular CLI的安装与使用教程
Jan 04 Javascript
使用vue-route 的 beforeEach 实现导航守卫(路由跳转前验证登录)功能
Mar 22 Javascript
vue嵌套路由与404重定向实现方法分析
May 04 Javascript
vue 中动态绑定class 和 style的方法代码详解
Jun 01 Javascript
webpack3.0升级4.0的方法步骤
Apr 02 Javascript
JS中双击和单击事件冲突的解决方法
Apr 09 #Javascript
vue脚手架及vue-router基本使用
Apr 09 #Javascript
vue 设置proxyTable参数进行代理跨域
Apr 09 #Javascript
Angular入口组件(entry component)与声明式组件的区别详解
Apr 09 #Javascript
快速搭建vue2.0+boostrap项目的方法
Apr 09 #Javascript
webpack 模块热替换原理
Apr 09 #Javascript
Angular5升级RxJS到5.5.3报错:EmptyError: no elements in sequence的解决方法
Apr 09 #Javascript
You might like
Zend Studio for Eclipse的java.lang.NullPointerException错误的解决方法
2008/12/06 PHP
php实现图片添加水印功能
2014/02/13 PHP
PHP中new static() 和 new self() 的区别介绍
2015/01/09 PHP
PHP创建/删除/复制文件夹、文件
2016/05/03 PHP
深入剖析PHP中printf()函数格式化使用
2016/05/23 PHP
基于JavaScript 数据类型之Boolean类型分析介绍
2013/04/19 Javascript
NodeJS制作爬虫全过程(续)
2014/12/22 NodeJs
Javascript基于对象三大特性(封装性、继承性、多态性)
2016/01/04 Javascript
基于JavaScript实现图片点击弹出窗口而不是保存
2016/02/06 Javascript
利用js编写网页进度条效果
2017/10/08 Javascript
详解使用webpack构建多页面应用
2017/12/21 Javascript
浅谈React Event实现原理
2018/09/20 Javascript
JS数组求和的常用方法总结【5种方法】
2019/01/14 Javascript
[01:00:25]NB vs Secret 2018国际邀请赛小组赛BO1 B组加赛 8.19
2018/08/21 DOTA
django文档学习之applications使用详解
2018/01/29 Python
Python中enumerate()函数编写更Pythonic的循环
2018/03/06 Python
Python线程池模块ThreadPoolExecutor用法分析
2018/12/28 Python
Python反爬虫技术之防止IP地址被封杀的讲解
2019/01/09 Python
如何基于Python实现电子邮件的发送
2019/12/16 Python
使用pyinstaller逆向.pyc文件
2019/12/20 Python
pytorch torch.nn.AdaptiveAvgPool2d()自适应平均池化函数详解
2020/01/03 Python
python orm 框架中sqlalchemy用法实例详解
2020/02/02 Python
如何在Python对Excel进行读取
2020/06/04 Python
英国领先的运动营养品牌:Protein Dynamix
2018/01/02 全球购物
美国豪华的多品牌精品店:The Webster
2019/07/31 全球购物
大学活动策划书范文
2014/01/10 职场文书
期末考试动员演讲稿
2014/01/10 职场文书
工厂保安员岗位职责
2014/01/31 职场文书
辅导员评语
2014/05/04 职场文书
机械电子工程专业自荐书
2014/06/10 职场文书
助学贷款贫困证明
2014/09/23 职场文书
给老婆的检讨书
2015/01/27 职场文书
中秋晚会致辞
2015/07/31 职场文书
python中如何对多变量连续赋值
2021/06/03 Python
vite+vue3.0+ts+element-plus快速搭建项目的实现
2021/06/24 Vue.js
MySQL提升大量数据查询效率的优化神器
2022/07/07 MySQL