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-世界上误解最深的语言分析
Aug 12 Javascript
javascript document.images实例
May 27 Javascript
javascript日期对象格式化为字符串的实现方法
Jan 14 Javascript
在jQuery中使用$而避免跟其它库产生冲突的方法
Aug 13 Javascript
理解JS绑定事件
Jan 19 Javascript
jQuery数组处理函数整理
Aug 03 Javascript
zTree异步加载展开第一级节点的实现方法
Sep 05 Javascript
js实现前面自动补全位数的方法
Oct 10 Javascript
微信小程序实现无限滚动列表
May 29 Javascript
vue实现条件叠加搜索的解决方法
May 28 Javascript
浅谈layui使用模板引擎动态渲染元素要注意的问题
Sep 14 Javascript
JavaScript阻止事件冒泡的方法
Dec 06 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.ini-dist 和 php.ini-recommended 的区别介绍(方便开发与安全的朋友)
2012/07/01 PHP
PHP安全的URL字符串base64编码和解码
2014/06/19 PHP
PHP实现图片自动清理的方法
2015/07/08 PHP
php 多文件上传的实现实例
2016/10/23 PHP
thinkPHP5.0框架环境变量配置方法
2017/03/17 PHP
PHP 模拟登陆功能实例详解
2019/09/10 PHP
jQuery创建插件的代码分析
2011/04/14 Javascript
表单提交前触发函数返回true表单才会提交
2014/03/11 Javascript
js字符串完全替换函数分享
2014/12/03 Javascript
js实现对table动态添加、删除和更新的方法
2015/02/10 Javascript
给before和after伪元素设置js效果的方法
2015/12/04 Javascript
js右下角弹出提示框示例代码
2016/01/12 Javascript
jQuery短信验证倒计时功能实现方法详解
2016/05/25 Javascript
jQuery 调用WebService 实例讲解
2016/06/28 Javascript
JS 实现计算器详解及实例代码(一)
2017/01/08 Javascript
从零开始学习Node.js系列教程三:图片上传和显示方法示例
2017/04/13 Javascript
JS设置手机验证码60s等待实现代码
2017/06/14 Javascript
二维码图片生成器QRCode.js简单介绍
2017/08/18 Javascript
vue2.0在没有dev-server.js下的本地数据配置方法
2018/02/23 Javascript
JavaScript对象拷贝与Object.assign用法实例分析
2018/06/20 Javascript
jQuery ajax仿Google自动提示SearchSuggess功能示例
2019/03/28 jQuery
前端js中的事件循环eventloop机制详解
2019/05/15 Javascript
layui加载数据显示loading加载完成loading消失的实例代码
2019/09/23 Javascript
微信小程序实现上传多张图片、删除图片
2020/07/29 Javascript
Python tkinter实现的图片移动碰撞动画效果【附源码下载】
2018/01/04 Python
python遍历文件夹找出文件夹后缀为py的文件方法
2018/10/21 Python
Python 单元测试(unittest)的使用小结
2018/11/14 Python
Python学习笔记之集合的概念和简单使用示例
2019/08/22 Python
python 多进程队列数据处理详解
2019/12/23 Python
pycharm不能运行.py文件的解决方法
2020/02/12 Python
Python调用REST API接口的几种方式汇总
2020/10/19 Python
利用html5 canvas破解简单验证码及getImageData接口应用
2013/01/25 HTML / CSS
12岁生日感言
2014/01/21 职场文书
结对共建协议书
2014/08/20 职场文书
某某店铺的开业庆典主持词范本
2019/11/25 职场文书
JavaScript实现音乐播放器
2022/08/14 Javascript