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 相关文章推荐
JS Timing
Apr 21 Javascript
Javascript中3种实现继承的方法和代码实例
Aug 12 Javascript
js获取json元素数量的方法
Jan 27 Javascript
Js实现简单的小球运动特效
Feb 18 Javascript
js完整倒计时代码分享
Sep 18 Javascript
JS判断Android、iOS或浏览器的多种方法(四种方法)
Jun 29 Javascript
JS实现去除数组中重复json的方法示例
Dec 21 Javascript
Koa项目搭建过程详细记录
Apr 12 Javascript
简单明了区分escape、encodeURI和encodeURIComponent
May 26 Javascript
Node.js对MongoDB进行增删改查操作的实例代码
Apr 18 Javascript
js实现鼠标滑动到某个div禁止滚动
Sep 17 Javascript
JS检测浏览器开发者工具是否打开的方法详解
Oct 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
PHP 编写的 25个游戏脚本
2009/05/11 PHP
深入理解:XML与对象的序列化与反序列化
2013/06/08 PHP
CentOS下PHP7的编译安装及MySQL的支持和一些常见问题的解决办法
2015/12/17 PHP
php实现登陆模块功能示例
2016/10/20 PHP
老生常谈PHP面向对象之解释器模式
2017/05/17 PHP
PHP中递归的实现实例详解
2017/11/14 PHP
php多进程并发编程防止出现僵尸进程的方法分析
2020/02/28 PHP
JavaScript Archive Network 集合
2007/05/12 Javascript
IE6下通过a标签点击切换图片的问题
2010/11/14 Javascript
关于jquery中全局函数each使用介绍
2013/12/10 Javascript
jquery 中的each()跳出循环的语句
2014/05/23 Javascript
jquery插件推荐 jquery.cookie
2014/11/09 Javascript
JS实现图文并茂的tab选项卡效果示例【附demo源码下载】
2016/09/21 Javascript
jQuery实现弹出窗口弹出div层的实例代码
2017/01/09 Javascript
JS+HTML5实现上传图片预览效果完整实例【测试可用】
2017/04/20 Javascript
Angular利用trackBy提升性能的方法
2018/01/26 Javascript
vue项目部署到Apache服务器中遇到的问题解决
2018/08/24 Javascript
[01:02:25]2014 DOTA2华西杯精英邀请赛5 24 NewBee VS VG
2014/05/25 DOTA
推荐11个实用Python库
2015/01/23 Python
python实现批量监控网站
2016/09/09 Python
Python编写一个闹钟功能
2017/07/11 Python
Python文本特征抽取与向量化算法学习
2017/12/22 Python
Python2包含中文报错的解决方法
2018/07/09 Python
selenium+python自动化测试之环境搭建
2019/01/23 Python
HTML5的结构和语义(5):内嵌媒体
2008/10/17 HTML / CSS
"引用"与指针的区别是什么
2016/09/07 面试题
会走路的树教学反思
2014/02/20 职场文书
环保公益广告语
2014/03/13 职场文书
优秀的2014年两会精神解读
2014/03/17 职场文书
第二课堂活动总结
2014/05/07 职场文书
视光学专业自荐信
2014/06/24 职场文书
买卖合同协议书范本
2014/10/18 职场文书
员工福利申请报告
2015/05/15 职场文书
解决Python字典查找报Keyerror的问题
2021/05/26 Python
动画「进击的巨人」第86话播出感谢绘公开
2022/03/21 日漫
java如何实现获取客户端ip地址的示例代码
2022/04/07 Java/Android