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 相关文章推荐
JavaScript 格式字符串的应用
Mar 29 Javascript
Javascript对象中关于setTimeout和setInterval的this介绍
Jul 21 Javascript
jquery实现select选中行、列合计示例
Apr 25 Javascript
node.js中的path.dirname方法使用说明
Dec 09 Javascript
快速掌握jQuery插件开发
Jan 19 Javascript
JavaScript和JQuery获取DIV值的方法示例
Mar 07 Javascript
JavaScript数据结构之双向链表和双向循环链表的实现
Nov 28 Javascript
vue-baidu-map 进入页面自动定位的解决方案(推荐)
Apr 28 Javascript
JS通过位运算实现权限加解密
Aug 14 Javascript
vue基础之使用get、post、jsonp实现交互功能示例
Mar 12 Javascript
详解Vue、element-ui、axios实现省市区三级联动
May 07 Javascript
微信小程序 调用远程接口 给全局数组赋值代码实例
Aug 13 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+mysql分页代码详解
2008/03/27 PHP
百万级别知乎用户数据抓取与分析之PHP开发
2015/09/28 PHP
YII Framework框架教程之使用YIIC快速创建YII应用详解
2016/03/15 PHP
CodeIgniter开发实现支付宝接口调用的方法示例
2016/11/14 PHP
老生常谈PHP面向对象之解释器模式
2017/05/17 PHP
PHP实现字符串翻转功能的方法【递归与循环算法】
2017/11/03 PHP
Javascript 遍历对象中的子对象
2009/07/03 Javascript
Javascript学习笔记1 数据类型
2010/01/11 Javascript
JavaScript中的this实例分析
2011/04/28 Javascript
javascript中普通函数的使用介绍
2013/12/19 Javascript
jquery实现checkbox全选全不选的简单实例
2013/12/31 Javascript
推荐一款jQuery插件模板
2015/01/09 Javascript
JS实现网页滚动条感应鼠标变色的方法
2015/02/26 Javascript
javascript操作select元素实例分析
2015/03/27 Javascript
js实时获取窗口大小变化的实例代码
2016/11/18 Javascript
JavaScript利用正则表达式替换字符串中的内容
2016/12/12 Javascript
解决淘宝cnpm 安装后cnpm不是内部或外部命令的问题
2018/05/17 Javascript
Vue.js中 v-model 指令的修饰符详解
2018/12/03 Javascript
JavaScript数据结构与算法之二叉树遍历算法详解【先序、中序、后序】
2019/02/21 Javascript
vue 实现 rem 布局或vw 布局的方法
2019/11/13 Javascript
JavaScript交换变量的常用方法小结【4种方法】
2020/05/07 Javascript
[04:32]DOTA2著名解说配音敌法师 现场专访海涛怒切假腿
2013/12/20 DOTA
Python实现决策树C4.5算法的示例
2018/05/30 Python
Centos 升级到python3后pip 无法使用的解决方法
2018/06/12 Python
python for循环输入一个矩阵的实例
2018/11/14 Python
解决python Markdown模块乱码的问题
2019/02/14 Python
python将视频转换为全字符视频
2019/04/26 Python
tensorflow保持每次训练结果一致的简单实现
2020/02/17 Python
用python实现一个简单计算器(完整DEMO)
2020/10/14 Python
前端面试必备之html5的新特性
2017/09/05 HTML / CSS
美国瑜伽品牌:Gaiam
2017/10/31 全球购物
英国汽车零件购物网站:GSF Car Parts
2019/05/23 全球购物
北美最大的零售退货翻新商:VIP Outlet
2019/11/21 全球购物
2015年计划生育协会工作总结
2015/05/13 职场文书
2015年支教教师工作总结
2015/07/22 职场文书
Golang gRPC HTTP协议转换示例
2022/06/16 Golang