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 操作Word和Excel的实现代码
Oct 26 Javascript
Wordpress ThickBox 点击图片显示下一张图的修改方法
Dec 11 Javascript
js 3秒后跳转页面的实现代码
Mar 10 Javascript
JS实现模拟风力的雪花飘落效果
May 13 Javascript
JS实现仿Windows7风格的网页右键菜单效果代码
Sep 11 Javascript
JavaScript之cookie技术详解
Nov 18 Javascript
jQuery插件jquery.kxbdmarquee.js实现无缝滚动效果
Feb 15 Javascript
JavaScript变速动画函数封装添加任意多个属性
Apr 03 Javascript
layui自定义ajax左侧三级菜单
Jul 26 Javascript
一看就会的vuex实现登录验证(附案例)
Jan 09 Javascript
js实现随机点名
Jan 19 Javascript
分享几个JavaScript运算符的使用技巧
Apr 24 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实现网站插件机制的方法
2009/11/10 PHP
解析PHP中intval()等int转换时的意外异常情况
2013/06/21 PHP
ThinkPHP快速入门实例教程之数据分页
2014/07/01 PHP
php正则表达式验证(邮件地址、Url地址、电话号码、邮政编码)
2016/03/14 PHP
Zend Framework框架实现类似Google搜索分页效果
2016/11/25 PHP
神奇的7个jQuery 3D插件整理
2011/01/06 Javascript
使用jquery实现select添加实现后台权限添加的效果
2011/05/28 Javascript
jquery实现的让超出显示范围外的导航自动固定屏幕最顶上
2011/09/22 Javascript
解释&amp;&amp;和||在javascript中的另类用法
2014/07/28 Javascript
浅谈jquery选择器 :first与:first-child的区别
2016/11/20 Javascript
js实现界面向原生界面发消息并跳转功能
2016/11/22 Javascript
js 博客内容进度插件详解
2017/02/19 Javascript
JavaScrpt中如何使用 cookie 设置查看与删除功能
2017/07/09 Javascript
vue 实现 tomato timer(蕃茄钟)实例讲解
2017/07/24 Javascript
对angularJs中2种自定义服务的实例讲解
2018/09/30 Javascript
微信小程序学习笔记之登录API与获取用户信息操作图文详解
2019/03/29 Javascript
layui table动态表头 改变表格头部 重新加载表格的方法
2019/09/21 Javascript
vue接口请求加密实例
2020/08/11 Javascript
ant design vue 表格table 默认勾选几项的操作
2020/10/31 Javascript
python client使用http post 到server端的代码
2013/02/10 Python
python创建一个最简单http webserver服务器的方法
2015/05/08 Python
基于python requests库中的代理实例讲解
2018/05/07 Python
使用python脚本实现查询火车票工具
2018/07/19 Python
python实现kNN算法识别手写体数字的示例代码
2019/08/16 Python
Python协程 yield与协程greenlet简单用法示例
2019/11/22 Python
Python3-异步进程回调函数(callback())介绍
2020/05/02 Python
目前不被任何主流浏览器支持的CSS3属性汇总
2014/07/21 HTML / CSS
html5-canvas中使用clip抠出一个区域的示例代码
2018/05/25 HTML / CSS
UGG英国官方网站:UGG UK
2018/02/08 全球购物
材料成型专业个人求职信范文
2013/09/25 职场文书
企业仓管员岗位职责
2014/06/15 职场文书
村主任“四风”问题个人整改措施
2014/10/04 职场文书
运动会闭幕式主持词
2015/07/01 职场文书
python中的class_static的@classmethod的巧妙用法
2021/06/22 Python
Flask使用SQLAlchemy实现持久化数据
2021/07/16 Python
windows server2012 R2下安装PaddleOCR服务的的详细步骤
2022/09/23 Servers