tsx

SFC:Vue 单文件组件

TSX:TypeScript 文件,包含 JavaScript XML(JSX)

// pnpm install @vitejs/plugin-vue-jsx -D

import { defineConfig } from "vite"
import vue from "@vitejs/plugin-vue"
import vueJsx from "@vitejs/plugin-vue-jsx"

export default defineConfig({
  plugins: [
    vue(),
    vueJsx() //插件使用
  ],
  css: {
    modules: {
      // 规定css类名的命名规则为小驼峰,即 child-item css 类在 js 中会变成 childItem 变量
      localsConvention: 'camelCase'
    }
  },
})

classnames

classNames('foo', 'bar') // => 'foo bar'

CSS Modules

css module 把 css 作为模块引入到 js 中,是一种技术流的组织css代码的策略,它将为css提供默认的局部作用域。

css module 对 css 文件命名有要求,必须在后缀名前面是module,例如xxx.module.css、xxx.module.less、xxx.module.scss。

vite.config.ts

css: {
  modules: {
    // 规定css类名的命名规则为小驼峰,即 child-item css 类在 js 中会变成 childItem 变量
    localsConvention: 'camelCase'
  }
},
const TsxDemo = defineComponent({
  setup() {
    return () => {
      return (
        <>
          <div class={styles.tableWrap}></div>
          {/* OR */}
          <div class={styles['table-wrap']}></div>
        </>
      )
    }
  },
})

export default TsxDemo

编译和使用

css module 会在编译的时候自动把类名加上一个哈希字符串,而使用 global 声明的 class 不会在编译的时候被加上哈希字符串。

index.module.scss

/** 形式一 */
.demo-normal {
  .normal-test {
    background-color: red !important;
  }
}
// 形式一会编译成:
._react-demo_1e21d_6 ._demo-test_1e21d_6 {
  background-color: red !important;
}

/** 形式二 */
.demo-global {
  :global {
    .global-test {
      background-color: red !important;
    }
  }
}
// 形式二会编译成:
._react-demo_86lo7_6 .demo-test {
  background-color: red !important;
}

类名使用引用的方式会被编译成哈希字符串的,global 声明则不能用引用的方式。

// 形式一
<div class={styles['demo-normal']}>
  <div class={styles['normal-test']}>
    normal
  </div>
</div>

// 形式二
<div class={styles['demo-global']}>
  <div class="global-test">
    global
  </div>
</div>

global 全局作用选择器

statistics.module.scss

// react,如果我们想要覆盖第三方的组件样式,用自己写的选择器名称是覆盖不了的,因为加了哈希字符串之后与组件默认样式的选择器名称不匹配;而使用 global 声明的 class,不会在编译的时候被加上哈希字符串,从而可以实现覆盖默认样式的效果。
.table-wrap {
  :global {
    .el-table td.el-table__cell,
    .el-table thead.is-group th.el-table__cell {
      padding: 5px !important;
    }
  }
}

// 区别 vue,即使用一个唯一的类名包着也会作用到有用到该类名的全局样式,慎用
// 比如在下方例子中,其他文件用了 .test 类名也会被影响到
.notice-dialog {
  :global(.el-dialog.is-fullscreen) {
    min-width: 900px !important;
  }
  :global(.test) {
    background-color: red !important;
  }
}
Copyright © Hazel Wei all rights reserved, powered by Gitbook            该文章修订时间: 2025-06-30 22:48:07

results matching ""

    No results matching ""