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 相关文章推荐
广告显示判断
Aug 31 Javascript
JavaScript入门之对象与JSON详解
Oct 21 Javascript
jQuery中data()方法用法实例
Dec 27 Javascript
javascript计时器编写过程与实现方法
Feb 29 Javascript
Java遍历集合方法分析(实现原理、算法性能、适用场合)
Apr 25 Javascript
Bootstrap Paginator分页插件使用方法详解
May 30 Javascript
常用Javascript函数与原型功能收藏(必看篇)
Oct 09 Javascript
angularJs 表格添加删除修改查询方法
Feb 27 Javascript
vue forEach循环数组拿到自己想要的数据方法
Sep 21 Javascript
element-ui带输入建议的input框踩坑(输入建议空白以及会闪出上一次的输入建议问题)
Jan 15 Javascript
Vue 微信端扫描二维码苹果端却只能保存图片问题(解决方法)
Jan 19 Javascript
使用 Github Actions 自动部署 Angular 应用到 Github Pages的方法
Jul 20 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
require(),include(),require_once()和include_once()区别
2008/03/27 PHP
php获取远程图片的两种 CURL方式和sockets方式获取远程图片
2011/11/07 PHP
探讨捕获php错误信息方法的详解
2013/06/09 PHP
php自定义session示例分享
2014/04/22 PHP
采用ThinkPHP中F方法实现快速缓存实例
2014/06/13 PHP
PHP单元测试框架PHPUnit用法详解
2019/01/23 PHP
jquery如何判断某元素是否具备指定的样式
2013/11/05 Javascript
jQuery中的height innerHeight outerHeight区别示例介绍
2014/06/15 Javascript
基于javascript实现判断移动终端浏览器版本信息
2014/12/09 Javascript
javascript字符串函数汇总
2015/12/06 Javascript
js实现简单的选项卡效果
2017/02/23 Javascript
JS中SetTimeout和SetInterval使用初探
2017/03/23 Javascript
微信小程序学习笔记之文件上传、下载操作图文详解
2019/03/29 Javascript
jQuery 查找元素操作实例小结
2019/10/02 jQuery
[01:21:58]守擂赛DOTA2第一周决赛
2020/04/22 DOTA
Python运算符重载用法实例分析
2015/06/01 Python
python实现将英文单词表示的数字转换成阿拉伯数字的方法
2015/07/02 Python
Python中的anydbm模版和shelve模版使用指南
2015/07/09 Python
Python元组操作实例分析【创建、赋值、更新、删除等】
2017/07/24 Python
Python与人工神经网络:使用神经网络识别手写图像介绍
2017/12/19 Python
OpenCV2.3.1+Python2.7.3+Numpy等的配置解析
2018/01/05 Python
浅析Python装饰器以及装饰器模式
2018/05/28 Python
pycharm+PyQt5+python最新开发环境配置(踩坑)
2019/02/11 Python
Python OOP类中的几种函数或方法总结
2019/02/22 Python
Python的轻量级ORM框架peewee使用教程
2021/02/05 Python
浅谈html5 响应式布局
2014/12/24 HTML / CSS
高三历史教学反思
2014/01/09 职场文书
秦兵马俑教学反思
2014/02/07 职场文书
小学毕业感言50字
2014/02/16 职场文书
校园环保建议书
2014/05/14 职场文书
服装设计专业自荐信
2014/06/17 职场文书
村道德模范事迹材料
2014/08/28 职场文书
工商局所长四风自我剖析及整改措施
2014/10/26 职场文书
2015年计划生育责任书
2015/05/08 职场文书
python 详解turtle画爱心代码
2022/02/15 Python
MySQL中一条SQL查询语句是如何执行的
2022/04/08 MySQL