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中URL编码函数代码
Jan 11 Javascript
js几秒以后倒计时跳转示例
Dec 26 Javascript
php和js对数据库图片进行等比缩放示例
Apr 28 Javascript
jquery实现简单实用的打分程序实例
Jul 23 Javascript
如何用javascript计算文本框还能输入多少个字符
Jul 29 Javascript
JavaScript中匿名函数的用法及优缺点详解
Jun 01 Javascript
vue中使用cropperjs的方法
Mar 01 Javascript
vue在手机中通过本机IP地址访问webApp的方法
Aug 15 Javascript
Node.js 进程平滑离场剖析小结
Jan 24 Javascript
Vue 中使用 typescript的方法详解
Feb 17 Javascript
在vue中通过render函数给子组件设置ref操作
Nov 17 Vue.js
vue+django实现下载文件的示例
Mar 24 Vue.js
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/10/06 PHP
php 计划任务 检测用户连接状态
2012/03/29 PHP
Yii2学习笔记之汉化yii设置表单的描述(属性标签attributeLabels)
2017/02/07 PHP
php实现产品加入购物车功能(1)
2020/07/23 PHP
PHP中关键字interface和implements详解
2017/06/14 PHP
jQuery源码分析-05异步队列 Deferred 使用介绍
2011/11/14 Javascript
JQuery给网页更换皮肤的方法
2015/05/30 Javascript
jQuery实现漂亮实用的商品图片tips提示框效果(无图片箭头+阴影)
2016/04/16 Javascript
node.js插件nodeclipse安装图文教程
2020/10/19 Javascript
DOM 事件的深入浅出(一)
2016/12/05 Javascript
微信小程序 解决请求服务器手机预览请求不到数据的方法
2017/01/04 Javascript
Javascript设计模式之装饰者模式详解篇
2017/01/17 Javascript
微信小程序 swiper制作tab切换实现附源码
2017/01/21 Javascript
nodejs操作mysql实现增删改查的实例
2017/05/28 NodeJs
Vue2.0 事件的广播与接收(观察者模式)
2018/03/14 Javascript
vue组件间通信六种方式(总结篇)
2019/05/15 Javascript
微信小程序判断用户是否需要再次授权获取个人信息
2019/07/18 Javascript
JS document对象简单用法完整示例
2020/01/14 Javascript
JS实现单张或多张图片持续无缝滚动的示例代码
2020/05/10 Javascript
解决python中使用plot画图,图不显示的问题
2018/07/04 Python
Python 利用切片从列表中取出一部分使用的方法
2019/02/01 Python
python简单实现矩阵的乘,加,转置和逆运算示例
2019/07/10 Python
python使用pandas抽样训练数据中某个类别实例
2020/02/28 Python
python同时遍历两个list用法说明
2020/05/02 Python
python golang中grpc 使用示例代码详解
2020/06/03 Python
python实现人性化显示金额数字实例详解
2020/09/25 Python
CSS3实现翘边的阴影效果的代码示例
2016/06/13 HTML / CSS
CSS3 transition 实现通知消息轮播条
2020/10/14 HTML / CSS
CSS3中animation实现流光按钮效果
2020/12/21 HTML / CSS
详解HTML5 Canvas绘制时指定颜色与透明度的方法
2016/03/25 HTML / CSS
番木瓜健康和保健产品第一大制造商:Herbal Papaya
2017/04/25 全球购物
英国二手iPhone、音乐、电影和游戏商店:musicMagpie
2018/10/26 全球购物
连锁超市项目计划书
2014/09/15 职场文书
学校党支部公开承诺书
2015/04/30 职场文书
微信小程序scroll-view不能左右滑动问题的解决方法
2021/07/09 Javascript
python实现手机推送 代码也就10行左右
2022/04/12 Python