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 checkbox全选、取消全选、删除功能代码
Dec 19 Javascript
浅析javascript闭包 实例分析
Dec 25 Javascript
DWZ刷新dialog解决方法
Mar 03 Javascript
jQuery trigger()方法用法介绍
Jan 13 Javascript
JS基于myFocus库实现各种功能的tab选项卡切换效果
Sep 19 Javascript
Seajs 简易文档 提供简单、极致的模块化开发体验
Apr 13 Javascript
Bootstrap每天必学之导航组件
Apr 25 Javascript
JS采用绝对定位实现回到顶部效果完整实例
Jun 20 Javascript
js/jq仿window文件夹框选操作插件
Mar 08 Javascript
jQuery使用ajax_动力节点Java学院整理
Jul 05 jQuery
微信小程序实现手指触摸画板
Jul 09 Javascript
vue开发简单上传图片功能
Jun 30 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开发留言板的CRUD(增,删,改,查)操作
2012/04/19 PHP
巧用php中的array_filter()函数去掉多维空值的代码分享
2012/09/07 PHP
了解PHP的返回引用和局部静态变量
2015/06/04 PHP
php中str_pad()函数用法分析
2017/03/28 PHP
PHP设计模式之模板方法模式定义与用法详解
2018/04/02 PHP
javascript 框架小结 个人工作经验
2009/06/13 Javascript
jQuery的三种$()
2009/12/30 Javascript
获取元素距离浏览器周边的位置的方法getBoundingClientRect
2013/04/17 Javascript
javascript break指定标签打破多层循环示例
2014/01/20 Javascript
Nodejs学习笔记之入门篇
2015/04/16 NodeJs
JavaScript 经典实例日常收集整理(常用经典)
2016/03/30 Javascript
AngularJS 整理一些优化的小技巧
2016/08/18 Javascript
JS中关于事件处理函数名后面是否带括号的问题
2016/11/16 Javascript
PHP获取当前页面完整URL的方法
2016/12/02 Javascript
jQuery EasyUI 获取tabs的实例解析
2016/12/06 Javascript
jQuery和CSS仿京东仿淘宝列表导航菜单
2017/01/04 Javascript
微信小程序swiper组件用法实例分析【附源码下载】
2017/12/07 Javascript
vue 弹窗时 监听手机返回键关闭弹窗功能(页面不跳转)
2019/05/10 Javascript
[01:24:34]2014 DOTA2华西杯精英邀请赛5 24 DK VS LGD
2014/05/25 DOTA
[01:02:45]完美世界DOTA2联赛 LBZS vs Forest 第三场 11.07
2020/11/09 DOTA
关于你不想知道的所有Python3 unicode特性
2014/11/28 Python
python 统计代码行数简单实例
2017/05/04 Python
Flask框架信号用法实例分析
2018/07/24 Python
使用python3构建文件传输的方法
2019/02/13 Python
SCHIESSER荷兰官方网站:德国内衣专家
2020/10/09 全球购物
如何执行一个shell程序
2012/11/23 面试题
金融专业个人求职信
2013/09/22 职场文书
学生励志演讲稿
2014/01/06 职场文书
内刊编辑求职自荐书范文
2014/02/19 职场文书
计算机专业毕业生自荐信范文
2014/03/06 职场文书
乡镇消防工作实施方案
2014/03/27 职场文书
幼儿园个人总结
2015/02/28 职场文书
实体类或对象序列化时,忽略为空属性的操作
2021/06/30 Java/Android
MySQL的Query Cache图文详解
2021/07/01 MySQL
TV动画《八十龟酱观察日记》第四季宣传PV公布
2022/04/06 日漫
Python find()、rfind()方法及作用
2022/12/24 Python