Vue3新特性之在Composition API中使用CSS Modules


Posted in Javascript onJuly 13, 2020

在 Vue 3 Composition API 最近的一次 beta 升级中,无论是 Vue 3 本 3 库 vue-next,还是面向 Vue 2 过渡用的 @vue/composition-api 库中,都同步更新了一个 useCSSModule 函数 -- 用来在使用了 Composition API 的 Vue 实例中,支持 CSS Modules 语法。

首先来看看什么是 CSS Modules:

CSS Modules

CSS Modules 是一种 CSS 的模块化和组合系统。vue-loader 集成 CSS Modules,可以作为模拟 scoped CSS 的替代方案。

启用 CSS Modules

如果是使用 vue cli 创建的项目,应该已经默认开启了这一特性;如果项目中需要手动开启,按如下设置:

// webpack.config.js
{
 module: {
  rules: [
   // ... 其它规则省略
   {
    test: /\.css$/,
    use: [
     'vue-style-loader',
     {
      loader: 'css-loader',
      options: {
       // 开启 CSS Modules
       modules: true,
       // 自定义生成的类名
       localIdentName: '[local]_[hash:base64:8]'
      }
     }
    ]
   }
  ]
 }
}

或者与其它预处理器一起使用:

// webpack.config.js -> module.rules
{
 test: /\.scss$/,
 use: [
  'vue-style-loader',
  {
   loader: 'css-loader',
   options: { modules: true }
  },
  'sass-loader'
 ]
}

然后在组件中的 <style> 上添加 module 特性:

<style module>
.red {
 color: red;
}
.bold {
 font-weight: bold;
}
</style>

在组件中访问 CSS Modules

在 <style> 上添加 module 后,一个叫做 $style 的计算属性就会被自动注入组件。

<template>
 <div>
  <p :class="$style.red">
   hello red!
  </p>
 </div>
</template>

因为这是一个计算属性,所以也支持 :class 的对象/数组语法:

<template>
 <div>
  <p :class="{ [$style.red]: isRed }">
   Am I red?
  </p>
  <p :class="[$style.red, $style.bold]">
   Red and bold
  </p>
 </div>
</template>

也可以通过 JavaScript 访问:

<script>
export default {
 created () {
  console.log(this.$style.red)
 }
}
</script>

Vue 2.x 传统用法

在 Options API 组件中:

<template>
 <span :class="$style.span1">hello 111 - {{ text }}</span>
</template>

<script>
export default {
 props: {
  text: {
   type: String,
   default: ''
  }
 }
};
</script>

<style lang="scss" module>
.span1 {
 color: red;
 font-size: 50px;
}
</style>

对于 JSX 组件,由于其没办法用 scoped style,所以 CSS Modules 是个很好的选择:

<script>
export default {
 props: {
  text: {
   type: String,
   default: ''
  }
 },
 render(h) {
  return <span class={this.$style.span1}>hello 222 - {this.text}</span>;
 }
};
</script>

<style lang="scss" module>
.span1 {
 color: blue;
 font-size: 40px;
}
</style>

Vue 3.x 中的 useCSSModule

引入 useCSSModule 函数后,在 Composition API 组件中使用 CSS Modules 就有了标准方案:

<template>
 <span :class="$style.span1">hello 333 - {{ text }}</span>
</template>

<script>
import { useCSSModule } from '@vue/composition-api';

export default {
 props: {
  text: {
   type: String,
   default: ''
  }
 },
 setup(props, context) {
  const $style = useCSSModule();
  return {
   $style
  };
 }
};
</script>

<style lang="scss" module>
.span1 {
 color: green;
 font-size: 30px;
}
</style>

其源码实现也是非常之简单,基本就是取出 this.$style 而已:

export const useCSSModule = (name = '$style'): Record<string, string> => {
 const instance = getCurrentInstance()
 if (!instance) {
  __DEV__ && warn(`useCSSModule must be called inside setup()`)
  return EMPTY_OBJ
 }

 const mod = (instance as any)[name]
 if (!mod) {
  __DEV__ &&
   warn(`Current instance does not have CSS module named "${name}".`)
  return EMPTY_OBJ
 }

 return mod as Record<string, string>
}

自定义 CSS Modules 注入名称

通过观察 useCSSModule 的源码发现,CSS Modules 的 name 好像可以不只是 $style;确实,在 .vue 文件中可以定义不止一个 <style module>,这可以通过设置 module 特性的值实现:

<style module="a">
 /* 注入标识符 a */
</style>

<style module="b">
 /* 注入标识符 b */
</style>

到此这篇关于Vue3新特性之在Composition API中使用CSS Modules的文章就介绍到这了,更多相关Vue3新特性之在Composition API中使用CSS Modules内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
原生js写的放大镜效果
Aug 22 Javascript
jquery更换文章内容与改变字体大小代码
Sep 30 Javascript
js和html5实现手机端刮刮卡抽奖效果完美兼容android/IOS
Nov 18 Javascript
javascript 判断两个日期之差的示例代码
Sep 05 Javascript
angularjs自定义ng-model标签的属性
Jan 21 Javascript
jQuery 弹出层插件(推荐)
May 24 Javascript
jQuery实现手势解锁密码特效
Aug 14 jQuery
js实现会跳动的日历效果(完整实例)
Oct 18 Javascript
五步轻松实现JavaScript HTML时钟效果
Mar 25 Javascript
基于Vue的侧边目录组件的实现
Feb 05 Javascript
javascript实现图片轮换动作方法
Aug 07 Javascript
小程序实现tab标签页
Nov 16 Javascript
Threejs实现滴滴官网首页地球动画功能
Jul 13 #Javascript
koa2 数据api中间件设计模型的实现方法
Jul 13 #Javascript
浅析JavaScript 函数防抖和节流
Jul 13 #Javascript
详解JavaScript 异步编程
Jul 13 #Javascript
javascript canvas时钟模拟器
Jul 13 #Javascript
微信小程序整个页面的自动适应布局的实现
Jul 12 #Javascript
uniapp 仿微信的右边下拉选择弹出框的实现代码
Jul 12 #Javascript
You might like
php学习之function的用法
2012/07/14 PHP
ThinkPHP实现跨模块调用操作方法概述
2014/06/20 PHP
php实现utf-8转unicode函数分享
2015/01/06 PHP
php序列化函数serialize() 和 unserialize() 与原生函数对比
2015/05/08 PHP
php 解析xml 的四种方法详细介绍
2016/10/26 PHP
Yii2.0建立公共方法简单示例
2019/01/29 PHP
PHP信号处理机制的操作代码讲解
2019/04/19 PHP
javaScript(JS)替换节点实现思路介绍
2013/04/17 Javascript
javascript的动态加载、缓存、更新以及复用(一)
2014/06/09 Javascript
JQuery实现超链接鼠标提示效果的方法
2015/06/10 Javascript
Angularjs 依赖压缩及自定义过滤器写法
2017/02/04 Javascript
JS实现动态修改table及合并单元格的方法示例
2017/02/20 Javascript
使用Xcache缓存器加速PHP网站的配置方法
2017/04/22 Javascript
修改npm全局安装模式的路径方法
2018/05/15 Javascript
Vue中Axios从远程/后台读取数据
2019/01/21 Javascript
微信小程序点击顶部导航栏切换样式代码实例
2019/11/12 Javascript
[01:59]深扒TI7聊天轮盘语音出处 1
2017/05/11 DOTA
python的类方法和静态方法
2014/12/13 Python
Python接收Gmail新邮件并发送到gtalk的方法
2015/03/10 Python
python利用datetime模块计算时间差
2015/08/04 Python
Python中for循环和while循环的基本使用方法
2015/08/21 Python
python文件特定行插入和替换实例详解
2017/07/12 Python
python实现mysql的读写分离及负载均衡
2018/02/04 Python
将python代码和注释分离的方法
2018/04/21 Python
python代码过长的换行方法
2018/07/19 Python
分析运行中的 Python 进程详细解析
2019/06/22 Python
如何使用Python标准库进行性能测试
2019/06/25 Python
Python如何使用Gitlab API实现批量的合并分支
2019/11/27 Python
python利用opencv实现SIFT特征提取与匹配
2020/03/05 Python
Django bulk_create()、update()与数据库事务的效率对比分析
2020/05/15 Python
警察群众路线对照检查材料思想汇报
2014/10/01 职场文书
公务员年度考核个人总结
2015/02/12 职场文书
2015年话务员工作总结
2015/04/29 职场文书
预备党员群众意见
2015/06/01 职场文书
初一语文教学反思
2016/03/03 职场文书
解决Windows Server2012 R2 无法安装 .NET Framework 3.5
2022/04/29 Servers