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 相关文章推荐
点击按钮或链接不跳转只刷新页面的脚本整理
Oct 22 Javascript
解析Javascript中中括号“[]”的多义性
Dec 03 Javascript
AngularJS入门教程(零):引导程序
Dec 06 Javascript
js验证身份证号有效性并提示对应信息
Oct 19 Javascript
日常收藏的jquery技巧
Dec 02 Javascript
js倒计时简单实现代码
Aug 11 Javascript
js实现简单的获取验证码按钮效果
Mar 03 Javascript
angularjs的select使用及默认选中设置
Apr 08 Javascript
jQuery插件FusionCharts绘制的3D双柱状图效果示例【附demo源码】
Apr 20 jQuery
jquery实现放大镜简洁代码(推荐)
Jun 08 jQuery
angularjs 动态从后台获取下拉框的值方法
Aug 13 Javascript
JS数组去重详情
Nov 07 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
星际争霸任务指南——虫族
2020/03/04 星际争霸
WinXP + Apache +PHP5 + MySQL + phpMyAdmin安装全功略
2006/07/09 PHP
基于mysql的论坛(6)
2006/10/09 PHP
php中解析带中文字符的url函数分享
2015/01/20 PHP
PHP7常量数组用法分析
2016/09/26 PHP
PHP面向对象程序设计方法实例详解
2016/12/24 PHP
PHP常用正则表达式精选(推荐)
2019/05/28 PHP
JS URL传中文参数引发的乱码问题
2009/09/02 Javascript
ie focus bug 解决方法
2009/09/03 Javascript
为javascript添加String.Format方法
2020/08/11 Javascript
深入理解JavaScript作用域和作用域链
2011/10/21 Javascript
解析js中获得父窗口链接getParent方法以及各种打开窗口的方法
2013/06/19 Javascript
js单例模式的两种方案
2013/10/22 Javascript
基于jquery ui的alert,confirm方案(支持换肤)
2015/04/03 Javascript
浅谈js多维数组和hash数组定义和使用
2016/07/27 Javascript
nodeJS删除文件方法示例
2016/12/25 NodeJs
Node.js读取文件内容示例
2017/03/07 Javascript
详谈js使用in和hasOwnProperty获取对象属性的区别
2017/04/25 Javascript
详解node.js平台下Express的session与cookie模块包的配置
2017/04/26 Javascript
详解使用PM2管理nodejs进程
2017/10/24 NodeJs
JavaScript继承定义与用法实践分析
2018/05/28 Javascript
vue中使用vue-cli接入融云实现即时通信
2019/04/19 Javascript
Vue数据驱动表单渲染,轻松搞定form表单
2019/07/19 Javascript
jQuery实现简单弹幕效果
2019/11/28 jQuery
Vue父子传递实例讲解
2020/02/14 Javascript
vue中keep-alive内置组件缓存的实例代码
2020/04/16 Javascript
vue 解决setTimeOut和setInterval函数无效报错的问题
2020/07/30 Javascript
python新手经常遇到的17个错误分析
2014/07/30 Python
Python基于time模块求程序运行时间的方法
2017/09/18 Python
浅谈Python NLP入门教程
2017/12/25 Python
python flask 如何修改默认端口号的方法步骤
2019/07/12 Python
用python wxpy管理微信公众号并利用微信获取自己的开源数据
2019/07/30 Python
2015个人半年总结范文
2015/03/09 职场文书
学雷锋献爱心活动总结
2015/05/11 职场文书
深入浅析python3 依赖倒置原则(示例代码)
2021/07/09 Python
Redis Lua脚本实现ip限流示例
2022/07/15 Redis