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同时按下两个方向键
Dec 01 Javascript
基于jquery的一个OutlookBar类,动态创建导航条
Nov 19 Javascript
JQuery 选择和过滤方法代码总结
Nov 19 Javascript
原生javascript实现的分页插件pagenav
Aug 28 Javascript
JavaScript实现图片轮播的方法
Jul 31 Javascript
Javascript原型链的原理详解
Jan 05 Javascript
js基于setTimeout与setInterval实现多线程
Jun 17 Javascript
yarn与npm的命令行小结
Oct 20 Javascript
vue 计时器组件的实现代码
Sep 14 Javascript
15分钟深入了解JS继承分类、原理与用法
Jan 19 Javascript
20道JS原理题助你面试一臂之力(必看)
Jul 22 Javascript
layui table设置某一行的字体颜色方法
Sep 05 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提示Notice: Undefined variable的解决办法
2012/11/24 PHP
解析CodeIgniter自定义配置文件
2013/06/18 PHP
php中chdir()函数用法实例
2014/11/13 PHP
JS类定义原型方法的两种实现的区别评论很多
2007/09/12 Javascript
JavaScript实现动态增加文件域表单
2009/02/12 Javascript
formvalidator验证插件中有关ajax验证问题
2013/01/04 Javascript
js清理Word格式示例代码
2014/02/13 Javascript
学习JavaScript鼠标响应事件
2015/12/25 Javascript
深入解析JavaScript中函数的Currying柯里化
2016/03/19 Javascript
Web前端开发工具——bower依赖包管理工具
2016/03/29 Javascript
JavaScript判断浏览器对CSS3属性是否支持的多种方法
2016/11/13 Javascript
Bootstrap的class样式小结
2016/12/01 Javascript
微信小程序实现工作时间段选择
2019/02/15 Javascript
如何解决js函数防抖、节流出现的问题
2019/06/17 Javascript
Vue 使用计时器实现跑马灯效果的实例代码
2019/07/11 Javascript
javascript刷新父页面方法汇总详解
2019/10/10 Javascript
vuex存储token示例
2019/11/11 Javascript
微信小程序全选多选效果实现代码解析
2020/01/21 Javascript
Python中的descriptor描述器简明使用指南
2016/06/02 Python
举例讲解Python中metaclass元类的创建与使用
2016/06/30 Python
疯狂上涨的Python 开发者应从2.x还是3.x着手?
2017/11/16 Python
Python对CSV、Excel、txt、dat文件的处理
2018/09/18 Python
python2与python3共存问题的解决方法
2018/09/18 Python
解决python给列表里添加字典时被最后一个覆盖的问题
2019/01/21 Python
Django项目基础配置和基本使用过程解析
2019/11/25 Python
Transpose 数组行列转置的限制方式
2020/02/11 Python
HTML5视频播放插件 video.js介绍
2018/09/29 HTML / CSS
美国精品家居用品网站:US-Mattress
2016/08/24 全球购物
回馈慈善的设计师太阳镜:DIFF eyewear
2019/10/17 全球购物
经济管理专业自荐信
2013/12/30 职场文书
《鸟岛》教学反思
2014/04/26 职场文书
住宅质量保证书
2014/04/29 职场文书
知识竞赛拉拉队口号
2014/06/16 职场文书
十佳青年事迹材料
2014/08/21 职场文书
机关班子查摆问题及整改措施
2014/10/28 职场文书
代码解析React中setState同步和异步问题
2021/06/03 Javascript