Vue 中使用 CSS Modules优雅方法

作者:fjc0k 时间:2024-04-30 10:23:39 

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优雅方法网站的支持!

来源:https://juejin.im/post/5ac5fd7f5188257cc20d854e

标签:vue,css,modules
0
投稿

猜你喜欢

  • 通过Python来使用七牛云存储的方法详解

    2022-09-13 19:56:36
  • python Web应用程序测试selenium库使用用法详解

    2023-10-05 22:15:00
  • 使用Rotate Master实现MySQL 多主复制的实现方法

    2024-01-13 11:23:25
  • python实现写数字文件名的递增保存文件方法

    2022-10-18 18:50:50
  • asp利用Split函数进行多关键字检索

    2011-03-16 11:10:00
  • win10系统Anaconda和Pycharm的Tensorflow2.0之CPU和GPU版本安装教程

    2021-07-25 09:43:52
  • aspjpeg 半透明描边的实现函数

    2008-12-17 12:02:00
  • python根据出生日期获得年龄的方法

    2022-05-22 23:52:46
  • 利用python Pandas实现批量拆分Excel与合并Excel

    2023-07-02 19:08:23
  • mysql8.0 windows x64 zip包安装配置教程

    2024-01-15 18:58:34
  • JS实现仿新浪微博发布内容为空时提示功能代码

    2023-08-22 21:52:13
  • js+css在交互上的应用

    2024-04-17 10:37:49
  • php 字符串函数收集

    2024-05-11 10:02:26
  • windows+apache+mod_python配置django运行环境

    2021-02-01 04:06:54
  • 使用pandas 将DataFrame转化成dict

    2022-08-11 17:46:33
  • 在PyCharm导航区中打开多个Project的关闭方法

    2022-08-11 01:39:11
  • python中ndarray数组的索引和切片的使用

    2022-10-12 13:49:55
  • 在Vue中配置代理服务器的方法详解

    2024-04-30 10:22:10
  • Django实现内容缓存实例方法

    2021-04-19 20:47:41
  • 在MySQL中为何不建议使用utf8

    2024-01-27 07:07:58
  • asp之家 网络编程 m.aspxhome.com