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分页
Jun 07 Javascript
学习ExtJS Column布局
Oct 08 Javascript
jquery的ajax和getJson跨域获取json数据的实现方法
Feb 04 Javascript
jQuery实现tab标签自动切换的方法
Feb 28 Javascript
全系IE支持Bootstrap的解决方法
Oct 19 Javascript
Immutable 在 JavaScript 中的应用
May 02 Javascript
AngularJS基础 ng-srcset 指令简单示例
Aug 03 Javascript
js创建对象几种方式的优缺点对比
Sep 28 Javascript
jQuery 如何实现一个滑动按钮开关
Dec 01 Javascript
Vue中使用的EventBus有生命周期
Jul 12 Javascript
从组件封装看Vue的作用域插槽的实现
Feb 12 Javascript
Vue中正确使用Element-UI组件的方法实例
Oct 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实现高效获取图片尺寸的方法
2014/12/12 PHP
ThinkPHP内置jsonRPC的缺陷分析
2014/12/18 PHP
php实现smarty模板无限极分类的方法
2015/12/07 PHP
浅谈php使用curl模拟多线程发送请求
2019/03/08 PHP
基于PHP实现堆排序原理及实例详解
2020/06/19 PHP
jQuery中extend函数的实现原理详解
2015/02/03 Javascript
js图片跟随鼠标移动代码
2015/11/26 Javascript
js判断登陆用户名及密码是否为空的简单实例
2016/05/16 Javascript
JavaScript面试开发常用的知识点总结
2016/08/08 Javascript
jQuery Easyui datagrid连续发送两次请求问题
2016/12/13 Javascript
js判断PC端与移动端跳转
2020/12/24 Javascript
Vue+Element UI+Lumen实现通用表格分页功能
2019/02/02 Javascript
vue路由--网站导航功能详解
2019/03/29 Javascript
解决vue-cli webpack打包开启Gzip 报错问题
2019/07/24 Javascript
vue中使用vee-validator完成表单校验方案
2019/11/01 Javascript
vue-router重写push方法,解决相同路径跳转报错问题
2020/08/07 Javascript
vue项目如何监听localStorage或sessionStorage的变化
2021/01/04 Vue.js
Python下的Mysql模块MySQLdb安装详解
2014/04/09 Python
Django模板变量如何传递给外部js调用的方法小结
2017/07/24 Python
Python 2.x如何设置命令执行的超时时间实例
2017/10/19 Python
Python 实现使用dict 创建二维数据、DataFrame
2018/04/13 Python
Python3 获取一大段文本之间两个关键字之间的内容方法
2018/10/11 Python
python 自动重连wifi windows的方法
2018/12/18 Python
django drf框架中的user验证以及JWT拓展的介绍
2019/08/12 Python
浅谈tensorflow中Dataset图片的批量读取及维度的操作详解
2020/01/20 Python
Python pexpect模块及shell脚本except原理解析
2020/08/03 Python
详解css3 flex弹性盒自动铺满写法
2020/09/17 HTML / CSS
英格兰足协官方商店:England Store
2019/07/12 全球购物
碧欧泉法国官网:Biotherm法国
2019/10/23 全球购物
网络程序员自荐信
2014/01/25 职场文书
房地产开盘策划方案
2014/02/10 职场文书
实训报告范文大全
2014/11/04 职场文书
python 遍历磁盘目录的三种方法
2021/04/02 Python
「Manga Time Kirara MAX」2022年5月号封面公开
2022/03/21 日漫
java版 联机五子棋游戏
2022/05/04 Java/Android
nginx配置指令之server_name的具体使用
2022/08/14 Servers