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 获取URL参数的插件
Mar 04 Javascript
jquery获取下拉列表的值为null的解决方法
Mar 18 Javascript
jQuery AJAX实现调用页面后台方法和web服务定义的方法分享
Mar 01 Javascript
js验证IP及子网掩码的合法性有效性示例
Apr 30 Javascript
jquery+ajax验证不通过也提交表单问题处理
Dec 12 Javascript
移动Web中图片自适应的两种JavaScript解决方法
Jun 18 Javascript
JS实现鼠标滑过显示边框的菜单效果
Sep 21 Javascript
angular ngClick阻止冒泡使用默认行为的方法
Nov 03 Javascript
Vue.js获取被选择的option的value和text值方法
Aug 24 Javascript
在vue中使用echarts图表实例代码详解
Oct 22 Javascript
微信小程序 Storage更新详解
Jul 16 Javascript
解决echarts图表使用v-show控制图表显示不全的问题
Jul 19 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
教你如何快捷的使用cmd访问mysql小技巧
2014/05/26 PHP
百度实时推送api接口应用示例
2014/10/21 PHP
php实现上传图片保存到数据库的方法
2015/02/11 PHP
PHP的Yii框架中移除组件所绑定的行为的方法
2016/03/18 PHP
PHP错误和异常处理功能模块示例
2016/11/12 PHP
PHP获取ttf格式文件字体名的方法示例
2019/03/06 PHP
jQuery hover 延时器实现代码
2011/03/12 Javascript
javascript动态创建及删除元素的方法
2014/12/22 Javascript
js实现对table动态添加、删除和更新的方法
2015/02/10 Javascript
JavaScript使用yield模拟多线程的方法
2015/03/19 Javascript
在JavaScript中操作时间之setYear()方法的使用
2015/06/12 Javascript
Bootstrap开发实战之响应式轮播图
2016/06/02 Javascript
jQuery组件easyui基本布局实现代码
2016/08/25 Javascript
分享一个原生的JavaScript拖动方法
2016/09/25 Javascript
bootstrap中使用google prettify让代码高亮的方法
2016/10/21 Javascript
jquery Easyui Datagrid实现批量操作(编辑,删除,添加)
2017/02/20 Javascript
Vue2.0组件间数据传递示例
2017/03/07 Javascript
详解如何从零开始搭建Express+Vue开发环境
2018/07/17 Javascript
基于jquery实现的tab选项卡功能示例【附源码下载】
2019/06/10 jQuery
js中!和!!的区别与用法
2020/05/09 Javascript
jQuery实现的分页插件完整示例
2020/05/26 jQuery
js实现简易拖拽的示例
2020/10/26 Javascript
Python linecache.getline()读取文件中特定一行的脚本
2008/09/06 Python
基于Python实现的百度贴吧网络爬虫实例
2015/04/17 Python
Python使用内置json模块解析json格式数据的方法
2017/07/20 Python
python实现简易云音乐播放器
2018/01/04 Python
Ubuntu20下的Django安装的方法步骤
2021/01/24 Python
基于Python的接口自动化unittest测试框架和ddt数据驱动详解
2021/01/27 Python
丝芙兰法国官网:SEPHORA法国
2016/09/01 全球购物
美国女孩服装购物网站:Justice
2017/03/04 全球购物
衰败城市英国官网:Urban Decay英国
2020/04/29 全球购物
个人实用简单的自我评价
2013/10/19 职场文书
个人评语大全
2014/05/04 职场文书
泸县召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
办公室禁烟通知
2015/04/23 职场文书
MySQL中rank() over、dense_rank() over、row_number() over用法介绍
2022/03/23 MySQL