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和css实现检测移动设备方向的变化并判断横竖屏幕
May 25 Javascript
js实现简洁大方的二级下拉菜单效果代码
Sep 01 Javascript
基于JavaScript创建动态Dom
Dec 08 Javascript
Javascript removeChild()删除节点及删除子节点的方法
Dec 27 Javascript
vue组件父子间通信之综合练习(聊天室)
Nov 07 Javascript
Vue 2.5.2下axios + express 本地请求404的解决方法
Feb 21 Javascript
vue自定义filters过滤器
Apr 26 Javascript
vue发送websocket请求和http post请求的实例代码
Jul 11 Javascript
微信小程序如何通过用户授权获取手机号(getPhoneNumber)
Jan 21 Javascript
vue路由切换时取消之前的所有请求操作
Sep 01 Javascript
js实现简单的倒计时
Jan 28 Javascript
vue实现水波涟漪效果的点击反馈指令
May 31 Vue.js
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数组添加与删除单元的常用函数实例分析
2015/02/16 PHP
Laravel中服务提供者和门面模式的入门介绍
2017/11/06 PHP
PHP基于ip2long实现IP转换整形
2020/12/11 PHP
Javascript实现页面跳转的几种方式分享
2013/10/26 Javascript
详解Javascript动态操作CSS
2014/12/08 Javascript
javascript引用赋值(地址传值)用法实例
2015/01/13 Javascript
jQuery实现的Tab滑动选项卡及图片切换(多种效果)小结
2015/09/14 Javascript
SublimeText自带格式化代码功能之reindent
2015/12/27 Javascript
Angularjs整合微信UI(weui)
2016/03/15 Javascript
js组件SlotMachine实现图片切换效果制作抽奖系统
2016/04/17 Javascript
js获取隐藏元素宽高的实现方法
2016/05/19 Javascript
BootStrap实现树形目录组件代码详解
2016/06/21 Javascript
全面了解JavaScript对象进阶
2016/07/19 Javascript
简单实现IONIC购物车功能
2017/01/10 Javascript
详解vue.js数据传递以及数据分发slot
2018/01/20 Javascript
vue eslint简要配置教程详解
2019/07/26 Javascript
Vue中通过属性绑定为元素绑定style行内样式的实例代码
2020/04/30 Javascript
[01:22]DOTA2神秘商店携大量周边降临完美大师赛
2017/11/07 DOTA
python设置windows桌面壁纸的实现代码
2013/01/28 Python
解析Python编程中的包结构
2015/10/25 Python
Python中不同进制的语法及转换方法分析
2016/07/27 Python
Python实现定时任务
2017/02/08 Python
详解Python装饰器
2019/03/25 Python
对Python中TKinter模块中的Label组件实例详解
2019/06/14 Python
Django-imagekit的使用详解
2020/07/06 Python
解决Python import .pyd 可能遇到路径的问题
2021/03/04 Python
html5 乒乓球(碰撞检测)实例二
2013/07/25 HTML / CSS
html5 拖拽及用 js 实现拖拽功能的示例代码
2020/10/23 HTML / CSS
农村产权制度改革实施方案
2014/03/21 职场文书
营业员岗位职责范本
2015/04/14 职场文书
2015暑期爱心支教策划书
2015/07/14 职场文书
学习弘扬焦裕禄精神心得体会
2016/01/23 职场文书
话题作文之生命的旋律
2019/12/17 职场文书
CSS3 实现的图片悬停的切换按钮
2021/04/13 HTML / CSS
golang 实现Location跳转方式
2021/05/02 Golang
Python中文分词库jieba(结巴分词)详细使用介绍
2022/04/07 Python