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 相关文章推荐
(仅IE下有效)关于checkbox 三态
May 12 Javascript
用jscript启动sqlserver
Jun 21 Javascript
基于jQuery的360图片展示实现代码
Jun 14 Javascript
jquery实现从数组移除指定的值
Jun 24 Javascript
javascript HTML+CSS实现经典橙色导航菜单
Feb 16 Javascript
js控制按钮,防止频繁点击响应的实例
Feb 15 Javascript
详解 vue.js用法和特性
Oct 15 Javascript
浅谈Webpack 持久化缓存实践
Mar 22 Javascript
JavaScript查看代码运行效率console.time()与console.timeEnd()用法
Jan 18 Javascript
跟混乱的页面弹窗说再见
Apr 11 Javascript
在Koa.js中实现文件上传的接口功能
Oct 08 Javascript
微信小程序基于movable-view实现滑动删除效果
Jan 08 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
全国FM电台频率大全 - 28 甘肃省
2020/03/11 无线电
十天学会php之第五天
2006/10/09 PHP
php邮件发送,php发送邮件的类
2011/03/24 PHP
通过php快速统计某个数据库中每张表的数据量
2012/09/04 PHP
使用php批量删除数据库下所有前缀为prefix_的表
2014/06/09 PHP
Yii学习总结之数据访问对象 (DAO)
2015/02/22 PHP
PHP简单判断iPhone、iPad、Android及PC设备的方法
2016/10/11 PHP
windows下的WAMP环境搭建图文教程(推荐)
2017/07/27 PHP
利用PHPStorm如何开发Laravel应用详解
2017/08/30 PHP
使用JQuery快速实现Tab的AJAX动态载入(实例讲解)
2013/12/11 Javascript
JQuery判断radio是否选中并获取选中值的示例代码
2014/10/17 Javascript
nodejs教程之制作一个简单的文章发布系统
2014/11/21 NodeJs
如何编写高质量JS代码
2014/12/28 Javascript
js实现Form栏显示全格式时间时钟效果代码
2015/08/19 Javascript
javascript运算符——逻辑运算符全面解析
2016/06/27 Javascript
jQuery 3.0十大新特性最终版发布
2016/07/14 Javascript
jQuery拖拽通过八个点改变div大小
2020/11/29 Javascript
JS实现移动端实时监听输入框变化的实例代码
2017/04/12 Javascript
JS生成随机打乱数组的方法示例
2017/12/23 Javascript
vue.js使用watch监听路由变化的方法
2018/07/08 Javascript
jQuery模拟12306城市选择框功能简单实现方法示例
2018/08/13 jQuery
微信小程序图片左右摆动效果详解
2019/07/13 Javascript
js实现计时器秒表功能
2019/12/16 Javascript
JavaScript arguments.callee作用及替换方案详解
2020/09/02 Javascript
[43:41]VP vs RNG 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.21.mp4
2020/07/19 DOTA
Python简单生成随机数的方法示例
2018/03/31 Python
Python利用sqlacodegen自动生成ORM实体类示例
2019/06/04 Python
django框架模板中定义变量(set variable in django template)的方法分析
2019/06/24 Python
英国在线汽车和面包车零件商店:Car Parts 4 Less
2018/08/15 全球购物
美国地毯购买网站:Rugs USA
2019/02/23 全球购物
市场营销专业推荐信
2013/11/03 职场文书
大学生简短的自我评价分享
2014/02/20 职场文书
品质口号大全
2014/06/17 职场文书
2014年超市工作总结
2014/11/19 职场文书
创业计划书之电动车企业
2019/10/11 职场文书
Apache Calcite 实现方言转换的代码
2021/04/24 Servers