React 小册 | CSS 解决方案

2,866 阅读3分钟

本篇主要记录 📝 一下 React 中 使用 css 的一些方案

  1. scss + css modules + antd 样式修改的问题

  2. styled-components 这个库的使用

  3. tailwind css ( 🔥 🔥 🔥 )

本文仓库地址 github.com/rick-chou/o…

时光机 👾

scss + css modules

这是我之前使用的方式 所以在这里记录一下

我们可以为对应的组件新建一个 index.module.scss 然后在里面书写 scss 的语法

然后在组件内 我们便可以用模块的方式使用这些 css 样式了

举个 🌰

.container {
  background: yellow;
}
import styles from './index.module.scss';

const App = () => {
  return (
    <div className={styles.container}>
      <h1>Header</h1>
    </div>
  );
};

export default App;

如果 项目中使用了 TS 的话 还需要为index.module.scss定义声明文件

新建index.module.scss.d.ts

export const container: string;

当然 如果不想为每一个样式 手动编写声明文件的话

你可以试一下

typings-for-css-modules-loader

or

typescript-plugin-css-modules

前者可以自动的帮助你生成声明文件 而后者需要配合 vscode 一起使用

以下为 typescript-plugin-css-modules 的配置

// compilerOptions
"plugins": [{ "name": "typescript-plugin-css-modules" }]

然后在 vscode 的setting.json 中

"typescript.tsserver.pluginPaths": ["typescript-plugin-css-modules"]

修改 antd 样式

我们引入一个 antd 的 Button

import styles from './index.module.scss';
import { Button } from 'antd';

const App = () => {
  return (
    <div className={styles.container}>
      <h1>Header</h1>
      <Button>Antd</Button>
    </div>
  );
};

export default App;

打开开发者调试工具 我们可以看到

我们可以看到 我们的 container 被加上了 一串 hash 而 antd 的样式名没有加 hash

所以我们要告诉 scss 在我们书写 antd 的样式时 不要加上 hash 这样样式名才会匹配 样式才能生效

我们可以用:global来包裹住不想被加上 hash 的样式

.container {
  color: red;
}

:global {
  .ant-btn {
    width: 300px;
  }
}

这样 antd 的样式就可以被我们修改啦 😈

styled-components

基本使用

import styled from 'styled-components';

export const Header = styled.div`
  font-size: 20px;
  color: red;
`;

export const Footer = styled.div`
  color: yellow;
`;

用``包裹的语法 是标签字符串

styled.div 这些都是第三方库中内置的方法

通过标签字符串 我们不仅可以调用该方法 而且可以在方法内部 通过某种匹配 得到每一个样式

最后在组件中 我们可以像使用普通组件那样来使用 CSS 样式

import React from 'react';
import { Header, Footer } from './style';
export default function App() {
  return (
    <div>
      <Header>我是Header</Header>
      <Footer>我是Footer</Footer>
    </div>
  );
}

高级用法

添加 attrs 属性

const HYInput = styled.input.attrs({
  placeholder: "请填写密码",
})`

props 穿透

props 可以被传递给 styled 组件

在组件中 我们传递 props

<Header color="blue"></Header>

在 styled 组件中 我们可以接收到 props

const Header = styled.div`
  color: ${(props) => props.color};
}`;

支持伪类和伪元素

export const Footer = styled.div`
  color: yellow;
  &:hover {
    color: blue;
  }
  &::after {
    content: '页脚';
  }
`;

支持选择器嵌套

export const Footer = styled.div`
  color: yellow;

  p {
    color: red;
  }
`;

tailwind

这是作者最近一直在使用的方式 非常推荐 🔥 🔥 🔥

使用起来也非常简单

  1. 安装 tailwindcss / postcss / autoprefixer
yarn add tailwindcss postcss autoprefixer -D
npx tailwindcss init
  1. 配置 tailwind.config 根据项目需要修改content内容
module.exports = {
  content: ['./index.html', './src/**/*.{js,ts,jsx,tsx}'],
  theme: {
    extend: {},
  },
  plugins: [],
};
  1. 配置 postcss.config.js
module.exports = {
  plugins: {
    tailwindcss: {},
    autoprefixer: {},
  },
}
  1. 在主入口的css文件中引入
@tailwind base;
@tailwind components;
@tailwind utilities;

然后就可以在项目中使用啦 🎉 🎉 🎉

<div className="text-4xl">tailwind css</div>

具体的css属性对应的tailwind写法可以参考

tailwindcss.com/docs/instal…