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:以前写的xmlhttp池,代码
May 18 Javascript
COM中获取JavaScript数组大小的代码
Nov 22 Javascript
jquery遍历筛选数组的几种方法和遍历解析json对象
Dec 13 Javascript
二叉树先序遍历的非递归算法具体实现
Jan 09 Javascript
JSONP获取Twitter和Facebook文章数的具体步骤
Feb 24 Javascript
基于jquery实现省市联动效果
Nov 23 Javascript
JavaScript过滤字符串中的中文与空格方法汇总
Mar 07 Javascript
javascript 动态样式添加的简单实现
Oct 11 Javascript
jQuery实现删除li节点的方法
Dec 06 Javascript
bootstrap table表格插件使用详解
May 08 Javascript
微信小程序开发之左右分栏效果的实例代码
May 20 Javascript
layui默认选中table的CheckBox复选框方法
Sep 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
神族 PROTOSS 概述
2020/03/14 星际争霸
PHP clearstatcache()函数详解
2010/03/02 PHP
thinkphp3.x中变量的获取和过滤方法详解
2016/05/20 PHP
PHP使用PHPExcel删除Excel单元格指定列的方法
2016/07/06 PHP
Laravel学习教程之IOC容器的介绍与用例
2017/08/15 PHP
利用PHP内置SERVER开启web服务(本地开发使用)
2020/01/22 PHP
PHP类的自动加载与命名空间用法实例分析
2020/06/05 PHP
比较详细的关于javascript中void(0)的具体含义解释
2007/08/02 Javascript
jQuery 判断元素上是否绑定了事件
2009/10/28 Javascript
JS解析XML的实现代码
2009/11/12 Javascript
网站页面自动跳转实现方法PHP、JSP(下)
2010/08/01 Javascript
input禁止键盘及中文输入,但可以点击
2014/02/13 Javascript
JS中产生20位随机数以0-9为例也可以是a-z A-Z
2014/08/01 Javascript
jQuery中:gt选择器用法实例
2014/12/29 Javascript
JS实现支持Ajax验证的表单插件
2016/03/24 Javascript
下一代Bootstrap的5个特点 超酷炫!
2016/06/17 Javascript
javascript与jquery动态创建html元素示例
2016/07/25 Javascript
如何使用headjs来管理和异步加载js
2016/11/29 Javascript
微信小程序 滚动到某个位置添加class效果实现代码
2017/04/19 Javascript
jQuery实现下拉菜单的实例代码
2017/06/19 jQuery
React Native之ListView实现九宫格效果的示例
2017/08/02 Javascript
微信小程序checkbox组件使用详解
2018/01/31 Javascript
解决vue2 在mounted函数无法获取prop中的变量问题
2018/11/15 Javascript
nuxt.js中间件实现拦截权限判断的方法
2018/11/21 Javascript
Python面向对象特殊成员
2017/04/24 Python
python 字符串和整数的转换方法
2018/06/25 Python
Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例
2018/07/18 Python
校长就职演讲稿
2014/01/06 职场文书
家长会演讲稿范文
2014/01/10 职场文书
静心口服夜广告词
2014/03/20 职场文书
房产委托公证书
2014/04/08 职场文书
合作协议书范本
2014/04/17 职场文书
学习“七一”讲话精神体会
2014/07/08 职场文书
县委务虚会发言材料
2014/10/20 职场文书
2016公司中秋节寄语
2015/12/07 职场文书
使用CSS实现小三角边框原理解析
2021/11/07 HTML / CSS