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 相关文章推荐
jQuery温习篇 强大的JQuery选择器
Apr 24 Javascript
javascript学习笔记(三)显示当时时间的代码
Apr 08 Javascript
文本框获得焦点和失去焦点的判断代码
Mar 18 Javascript
本地图片预览(支持IE6/IE7/IE8/Firefox3)经验总结
Mar 25 Javascript
jQuery判断checkbox(复选框)是否被选中以及全选、反选实现代码
Feb 21 Javascript
使用js画图之圆、弧、扇形
Jan 12 Javascript
js+div实现文字滚动和图片切换效果代码
Aug 27 Javascript
过期软件破解办法实例详解
Jan 04 Javascript
函数四种调用模式以及其中的this指向
Jan 16 Javascript
JS数组搜索之折半搜索实现方法分析
Mar 27 Javascript
Angular通过angular-cli来搭建web前端项目的方法
Jul 27 Javascript
vue router 跳转后回到顶部的实例
Aug 31 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重定向的三种方法分享
2012/02/22 PHP
php的hash算法介绍
2014/02/13 PHP
ThinkPHP结合AjaxFileUploader实现无刷新文件上传的方法
2014/10/29 PHP
php字符串过滤与替换小结
2015/01/26 PHP
微信支付PHP SDK之微信公众号支付代码详解
2015/12/09 PHP
php通过curl添加cookie伪造登陆抓取数据的方法
2016/04/02 PHP
制作个性化的WordPress登陆界面的实例教程
2016/05/21 PHP
php实现的二叉树遍历算法示例
2017/06/15 PHP
详解no input file specified 三种解决方法
2019/11/29 PHP
基于jquery实现漂亮的动态信息提示效果
2011/08/02 Javascript
中文路径导致unitpngfix.js不正常的解决方法
2013/06/26 Javascript
javascript实用小函数使用介绍
2013/11/11 Javascript
JQuery的Ajax请求实现局部刷新的简单实例
2014/02/11 Javascript
Javascript遍历Html Table示例(包括内容和属性值)
2014/07/08 Javascript
BootStrap3中模态对话框的使用
2017/01/06 Javascript
JAVA中截取字符串substring用法详解
2017/04/14 Javascript
利用C/C++编写node.js原生模块的方法教程
2017/07/07 Javascript
Javascript 一些需要注意的细节(必看篇)
2017/07/08 Javascript
Vue中使用Sortable的示例代码
2018/04/07 Javascript
微信小程序多音频播放进度条问题
2018/08/28 Javascript
JS返回页面时自动回滚到历史浏览位置
2018/09/26 Javascript
ztree加载完成后显示勾选节点的实现代码
2018/10/22 Javascript
Vue.js 图标选择组件实践详解
2018/12/03 Javascript
详解vue的数据劫持以及操作数组的坑
2019/04/18 Javascript
小程序根据手机机型设置自定义底部导航距离
2019/06/04 Javascript
python中pygame模块用法实例
2014/10/09 Python
对于Python中线程问题的简单讲解
2015/04/03 Python
windows下python安装小白入门教程
2018/09/18 Python
美国领先的礼品卡网站:GiftCards.com
2016/11/02 全球购物
秘书英文求职信范文
2014/01/31 职场文书
经营管理策划方案
2014/05/22 职场文书
开业庆典活动策划方案
2014/09/21 职场文书
导游词之张家口
2019/12/13 职场文书
golang 如何通过反射创建新对象
2021/04/28 Golang
python 学习GCN图卷积神经网络
2022/05/11 Python
使用CSS实现音波加载效果
2023/05/07 HTML / CSS