React全家桶笔记(七):React UI组件库 — Ant Design实践

3 阅读5分钟

React全家桶笔记(七):React UI组件库 — Ant Design实践

本篇介绍 React 生态中最流行的 UI 组件库 Ant Design 的使用,包括基本使用、按需引入和自定义主题。 📺 对应张天禹react全家桶视频:P94 - P96


一、流行的 React UI 组件库

1.1 国内

  • Ant Design(蚂蚁金服)— React 生态最流行的 UI 库 ✅
  • Ant Design Mobile — Ant Design 的移动端版本
  • TDesign(腾讯)— 企业级设计体系
  • Arco Design(字节跳动)— 企业级设计系统
  • Semi Design(抖音)— 现代化设计系统

1.2 国外

  • Material UI(Google Material Design 风格)— 国外最流行
  • Chakra UI — 简洁、模块化
  • Mantine — 功能丰富,开发体验好

🔗 概念扩展:UI 组件库的价值 UI 组件库提供了一套经过设计和测试的通用组件(按钮、表格、表单、弹窗等),让开发者不需要从零造轮子,专注于业务逻辑。选择组件库时主要考虑:社区活跃度、文档质量、定制能力、包体积。


二、Ant Design 基本使用(P94)

2.1 安装

npm install antd

2.2 基本使用

import React, { Component } from 'react'
import { Button, DatePicker } from 'antd'
import 'antd/dist/antd.css'  // 引入全量样式

const { RangePicker } = DatePicker

export default class App extends Component {
  render() {
    return (
      <div>
        App...
        <button>原生按钮</button>
        <Button type="primary">Antd 主按钮</Button>
        <Button>Antd 默认按钮</Button>
        <Button type="dashed">Antd 虚线按钮</Button>
        <Button danger>Antd 危险按钮</Button>
        <DatePicker />
        <RangePicker />
      </div>
    )
  }
}

使用步骤

  1. 安装 antd:npm install antd
  2. 引入组件:import { Button } from 'antd'
  3. 引入样式:import 'antd/dist/antd.css'
  4. 直接使用组件

⚠️ 问题import 'antd/dist/antd.css' 会引入 antd 的全量样式(几百 KB),即使你只用了一个 Button,也会把所有组件的样式都打包进来。


三、Ant Design 样式的按需引入(P95)

3.1 问题

全量引入样式文件体积太大,影响首屏加载速度。我们需要按需加载:用了哪个组件,就只引入哪个组件的样式。

3.2 方案:使用 react-app-rewired + customize-cra

npm install react-app-rewired customize-cra babel-plugin-import

修改 package.json

{
  "scripts": {
    "start": "react-app-rewired start",
    "build": "react-app-rewired build",
    "test": "react-app-rewired test"
  }
}

在项目根目录创建 config-overrides.js

const { override, fixBabelImports } = require('customize-cra')

module.exports = override(
  fixBabelImports('import', {
    libraryName: 'antd',
    libraryDirectory: 'es',
    style: 'css',  // 自动按需引入 CSS
  })
)

使用时不再需要手动引入样式

import React, { Component } from 'react'
import { Button } from 'antd'
// 不需要再写 import 'antd/dist/antd.css'
// babel-plugin-import 会自动按需引入对应组件的样式

export default class App extends Component {
  render() {
    return (
      <div>
        <Button type="primary">按需引入</Button>
      </div>
    )
  }
}

🔗 概念扩展:react-app-rewired 是什么? CRA(Create React App)默认不暴露 webpack 配置。如果想修改配置,要么 npm run eject(不可逆),要么用 react-app-rewired 在不 eject 的情况下覆盖配置。customize-cra 提供了一系列便捷的配置覆盖函数。

💡 Antd 5.x 更新:Ant Design 5.x 版本已经内置了按需加载,使用 CSS-in-JS 方案,不再需要 babel-plugin-import。直接 import { Button } from 'antd' 即可,样式会自动按需注入。教程中的配置适用于 Antd 4.x 及以下版本。


四、Ant Design 自定义主题(P96)

4.1 需求

Ant Design 默认主题色是蓝色(#1890ff),如果项目需要其他主题色(如红色、绿色),需要自定义主题。

4.2 Antd 4.x 方案:Less 变量覆盖

npm install less less-loader

修改 config-overrides.js

const { override, fixBabelImports, addLessLoader } = require('customize-cra')

module.exports = override(
  fixBabelImports('import', {
    libraryName: 'antd',
    libraryDirectory: 'es',
    style: true,  // 改为 true,加载 less 文件(而非 css)
  }),
  addLessLoader({
    lessOptions: {
      javascriptEnabled: true,
      // 自定义主题色
      modifyVars: { '@primary-color': '#1DA57A' },
    },
  })
)

修改后重启项目,所有 antd 组件的主题色就变成了绿色 #1DA57A

4.3 Antd 5.x 方案:ConfigProvider

import { ConfigProvider, Button } from 'antd'

function App() {
  return (
    <ConfigProvider
      theme={{
        token: {
          colorPrimary: '#1DA57A',
          borderRadius: 6,
          fontSize: 14,
        },
      }}
    >
      <Button type="primary">自定义主题</Button>
    </ConfigProvider>
  )
}

💡 Antd 5.x 的主题定制更加简单直观,通过 ConfigProvider 的 theme 属性即可配置,不再需要 Less 变量覆盖。

4.4 常用的可自定义变量(Antd 4.x)

@primary-color: #1890ff;          // 主题色
@link-color: #1890ff;             // 链接色
@success-color: #52c41a;          // 成功色
@warning-color: #faad14;          // 警告色
@error-color: #f5222d;            // 错误色
@font-size-base: 14px;            // 主字号
@heading-color: rgba(0,0,0,0.85); // 标题色
@text-color: rgba(0,0,0,0.65);    // 主文本色
@border-radius-base: 2px;         // 组件/浮层圆角
@border-color-base: #d9d9d9;      // 边框色
@box-shadow-base: 0 3px 6px -4px rgba(0,0,0,0.12); // 浮层阴影

五、实际项目中使用 Antd 的建议

Antd 使用建议:
├── 版本选择
│   ├── 新项目推荐 Antd 5.x(CSS-in-JS,无需额外配置)
│   └── 老项目维护可能还在 4.x(需要按需引入配置)
├── 按需引入
│   ├── Antd 5.x:内置按需加载,直接用
│   └── Antd 4.x:babel-plugin-import
├── 主题定制
│   ├── Antd 5.x:ConfigProvider + theme
│   └── Antd 4.x:Less 变量覆盖
├── 国际化
│   └── ConfigProvider 的 locale 属性
├── 图标
│   └── @ant-design/icons 独立包,按需引入
└── 文档
    └── ant.design — 组件 API 和示例非常详细

🎯 面试高频:你在项目中是如何使用 Ant Design 的?

  1. 安装 antd,按需引入组件
  2. 通过 ConfigProvider(5.x)或 Less 变量(4.x)自定义主题
  3. 使用 ProComponents(高级组件)处理复杂表格、表单场景
  4. 通过 ConfigProvider 配置国际化
  5. 对于特殊需求,基于 antd 组件二次封装

本章知识图谱

React UI 组件库
├── Ant Design
│   ├── 安装:npm install antd
│   ├── 使用:import { Button } from 'antd'
│   ├── 按需引入
│   │   ├── 5.x:内置,无需配置
│   │   └── 4.x:babel-plugin-import + react-app-rewired
│   └── 自定义主题
│       ├── 5.x:ConfigProvider theme
│       └── 4.x:Less modifyVars
├── 工程化工具
│   ├── react-app-rewired:不 eject 修改 CRA 配置
│   ├── customize-cra:便捷配置覆盖
│   └── babel-plugin-import:按需加载插件
└── 其他选择
    ├── Material UI(国外主流)
    ├── Arco Design(字节)
    └── TDesign(腾讯)

📌 下一篇:[React全家桶笔记(八):Redux与React-Redux状态管理] 将进入 React 状态管理的核心 — Redux,学习集中式状态管理的设计思想和实践。