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 相关文章推荐
javascript下判断一个元素是否存在的代码
Mar 05 Javascript
javascript 函数调用的对象和方法
Jul 01 Javascript
document.getElementById的简写方式(获取id对象的简略写法)
Sep 10 Javascript
jquery获取自定义属性(attr和prop)实例介绍
Apr 21 Javascript
js window.print实现打印特定控件或内容
Sep 16 Javascript
利用浏览器全屏api实现js全屏
Jan 16 Javascript
控制文字内容的显示与隐藏示例
Jun 11 Javascript
canvas知识总结
Jan 25 Javascript
如何为你的JS项目添加智能提示与类型检查详解
Mar 12 Javascript
js form表单input框限制20个字符,10个汉字代码实例
Apr 12 Javascript
javascript自定义日期比较函数用法示例
Jul 22 Javascript
vue中使用vee-validator完成表单校验方案
Nov 01 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中explode的负数limit用法分析
2015/02/27 PHP
JavaScript中this关键字使用方法详解
2007/03/08 Javascript
JS中字符问题(二进制/十进制/十六进制及ASCII码之间的转换)
2008/11/03 Javascript
JQuery 解析多维的Json数据格式
2009/11/02 Javascript
基于jquery 的一个progressbar widge
2010/10/29 Javascript
JavaScript高级程序设计阅读笔记(五) ECMAScript中的运算符(一)
2012/02/27 Javascript
js屏蔽鼠标键盘(右键/Ctrl+N/Shift+F10/F11/F5刷新/退格键)
2013/01/24 Javascript
Javascript控制页面链接在新窗口打开具体方法
2013/08/16 Javascript
jQuery之字体大小的设置方法
2014/02/27 Javascript
node.js中的fs.write方法使用说明
2014/12/15 Javascript
JavaScript组件焦点与页内锚点间传值的方法
2015/02/02 Javascript
详解Node.js包的工程目录与NPM包管理器的使用
2016/02/16 Javascript
Node.js 日志处理模块log4js
2016/08/28 Javascript
JavaScript的继承实现小结
2017/05/07 Javascript
JS实现简单抖动效果
2017/06/01 Javascript
vue2.0的虚拟DOM渲染思路分析
2018/08/09 Javascript
jQuery使用ajax传递json对象到服务端及contentType的用法示例
2020/03/12 jQuery
es6数组的flat(),flatMap()函数用法实例分析
2020/04/18 Javascript
jquery+css3实现的经典弹出层效果示例
2020/05/16 jQuery
一文秒懂JavaScript构造函数、实例、原型对象以及原型链
2020/08/25 Javascript
python使用线程封装的一个简单定时器类实例
2015/05/16 Python
linecache模块加载和缓存文件内容详解
2018/01/11 Python
Python3利用print输出带颜色的彩色字体示例代码
2019/04/08 Python
使用django的ORM框架按月统计近一年内的数据方法
2019/07/18 Python
python如何实现数据的线性拟合
2019/07/19 Python
Django框架 信号调度原理解析
2019/09/04 Python
YUV转为jpg图像的实现
2019/12/09 Python
基于Python实现简单学生管理系统
2020/07/24 Python
美国家居装饰购物网站:Amanda Lindroth
2020/03/25 全球购物
高中历史教学反思
2014/02/08 职场文书
交通安全主题班会
2015/08/12 职场文书
大学班干部竞选稿
2015/11/20 职场文书
《水浒传》读后感3篇(范文)
2019/09/19 职场文书
提取视频中的音频 Python只需要三行代码!
2021/05/10 Python
SpringBoot 集成Redis 过程
2021/06/02 Redis
PostgreSQL自动更新时间戳实例代码
2021/11/27 PostgreSQL