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动画之圆形运动,环绕鼠标运动作小球
Jul 20 Javascript
js,jQuery 排序的实现代码,网页标签排序的实现,标签排序
Apr 27 Javascript
用户代理字符串userAgent可实现的四个识别
Sep 20 Javascript
Bootstrap弹出带合法性检查的登录框实例代码【推荐】
Jun 23 Javascript
jquery 抽奖小程序实现代码
Oct 12 Javascript
JS中的Replace()传入函数时的用法详解
Sep 11 Javascript
详解vue项目首页加载速度优化
Oct 18 Javascript
JavaScript设计模式之工厂模式简单实例教程
Jul 03 Javascript
微信小程序实现星星评价效果
Nov 02 Javascript
vue柱状进度条图像的完美实现方案
Aug 26 Javascript
使用原生JS实现滚轮翻页效果的示例代码
May 31 Javascript
在实例中重学JavaScript事件循环
Dec 03 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入门学习的几个不错的实例代码
2008/07/13 PHP
根据中文裁减字符串函数的php代码
2013/12/03 PHP
PHP和Shell实现检查SAMBA与NFS Server是否存在
2015/01/07 PHP
php中二维数组排序问题方法详解
2015/08/28 PHP
ThinkPHP进程计数类Process用法实例详解
2015/09/25 PHP
PHP AjaxForm提交图片上传并显示图片源码
2016/11/29 PHP
PHP PDOStatement::closeCursor讲解
2019/01/30 PHP
基于ThinkPHP删除目录及目录文件函数
2020/10/28 PHP
asp javascript 实现关闭窗口时保存数据的办法
2007/11/24 Javascript
JavaScript 对象、函数和继承
2009/07/07 Javascript
JQuery 动画卷页 返回顶部 动画特效(兼容Chrome)
2010/02/15 Javascript
JavaScript中判断函数是new还是()调用的区别说明
2011/04/07 Javascript
jquery中ajax学习笔记4
2011/10/16 Javascript
JavaScript建立一个语法高亮输入框实现思路
2013/02/26 Javascript
jquery利用拖拽方式在图片上添加热链接
2015/11/24 Javascript
微信小程序之GET请求的实例详解
2017/09/29 Javascript
Bootstrap框架建立树形菜单(Tree)的实例代码
2017/10/30 Javascript
(模仿京东用户注册)用JQuery实现简单表单验证,初学者必看
2018/01/08 jQuery
详解vuex的简单todolist例子
2019/07/14 Javascript
Javascript原生ajax请求代码实例
2020/02/20 Javascript
解决ant Design中this.props.form.validateFields未执行的问题
2020/10/27 Javascript
python subprocess 杀掉全部派生的子进程方法
2017/01/16 Python
Python简单生成随机数的方法示例
2018/03/31 Python
Python3使用正则表达式爬取内涵段子示例
2018/04/22 Python
在pycharm中设置显示行数的方法
2019/01/16 Python
详解python算法之冒泡排序
2019/03/05 Python
Django如何使用第三方服务发送电子邮件
2019/08/14 Python
Python eval函数介绍及用法
2020/11/09 Python
方法名是否可以与构造器的名字相同
2012/06/04 面试题
关于幼儿的自我评价
2013/12/18 职场文书
文员的职业生涯规划发展方向
2014/02/08 职场文书
水利水电建筑施工应届生求职信
2014/07/04 职场文书
党的群众路线学习笔记
2014/11/06 职场文书
2015年档案管理员工作总结
2015/05/13 职场文书
采购员工作总结范文
2015/08/12 职场文书
Spring Security使用单点登录的权限功能
2022/04/03 Java/Android