React系列十二 - AntDesign UI库

简介: 对于学习过程,不是特别建议从一开始就使用别人的第三方库UI库,更重要的是要学会组件化相关的知识(就想前面我们已经讲了非常相关知识),之后自己来封装、设计一套自己的可复用组件。但是在公司开发为了开发效率,我们往往也会选择一些非常优秀的第三方UI库,而AntDesign就是这样的一套优秀的UI组件库。

一. 认识AntDesign


1.1. AntDesign的介绍


AntDesign ,简称 antd 是基于 Ant Design 设计体系的 React UI 组件库,主要用于研发企业级中后台产品。

AntDesign的特点:

  • 🌈 提炼自企业级中后台产品的交互语言和视觉风格。
  • 📦 开箱即用的高质量 React 组件。
  • 🛡 使用 TypeScript 开发,提供完整的类型定义文件。
  • ⚙️ 全链路开发和设计工具体系。
  • 🌍 数十个国际化语言支持。
  • 🎨 深入每个细节的主题定制能力。

全链路开发和设计指的是什么?

  • 全链路这个词我记得是16年左右阿里提出的;
  • 业务战略—用户场景—设计目标—交互体验—用户流程—预期效率全方面进行分析和考虑;
  • 这个主要是产品经理会考虑的一个点;

AntDesign的兼容性:

  • 现代浏览器和 IE11(需要 polyfills)。
  • 支持服务端渲染。
  • Electron

image.png                                              浏览器兼容

antd@2.0 之后不再支持 IE8,antd@4.0 之后不再支持 IE9/10。

目前稳定的版本:v4.4.0


1.2. AntDesign的安装


使用 npm 或 yarn 安装

npm安装:

npm install antd --save

yarn安装:

yarn add antd

我们需要在index.js中引入全局的Antd样式:

import "antd/dist/antd.css";

在App.js中就可以使用一些组件了:

image.png                                                   antd的使用

考虑一个问题:Antd是否会将一些没有用的代码(组件或者逻辑代码)引入,造成包很大呢?

antd 官网有提到:antd 的 JS 代码默认支持基于 ES modules 的 tree shaking,对于 js 部分,直接引入 import { Button } from 'antd' 就会有按需加载的效果。


1.3. 高级配置


1.3.1. 认识craco


上面的使用过程是无法对主题进行配置的,好像对主题等相关的高级特性进行配置,需要修改create-react-app 的默认配置。

如何修改create-react-app 的默认配置呢?

  • 前面我们讲过,可以通过yarn run eject来暴露出来对应的配置信息进行修改;
  • 但是对于webpack并不熟悉的人来说,直接修改 CRA 的配置是否会给你的项目带来负担,甚至会增加项目的隐患和不稳定性呢?
  • 所以,在项目开发中是不建议大家直接去修改 CRA 的配置信息的;

那么如何来进行修改默认配置呢?社区目前有两个比较常见的方案:

  • react-app-rewired + customize-cra;(这个是antd早期推荐的方案)
  • craco;(目前antd推荐的方案)

第一步:安装craco:

yarn add @craco/craco

第二步:修改package.json文件

  • 原本启动时,我们是通过react-scripts来管理的;
  • 现在启动时,我们通过craco来管理;
"scripts": {
-   "start": "react-scripts start",
-   "build": "react-scripts build",
-   "test": "react-scripts test",
+   "start": "craco start",
+   "build": "craco build",
+   "test": "craco test",
}

第三步:在根目录下创建craco.config.js文件用于修改默认配置

module.exports = {
  // 配置文件
}


1.3.2. 配置主题


按照 配置主题 的要求,自定义主题需要用到类似 less-loader 提供的 less 变量覆盖功能:

  • 我们可以引入 craco-less 来帮助加载 less 样式和修改变量;

安装 craco-less

yarn add craco-less

修改craco.config.js中的plugins:

  • 使用modifyVars可以在运行时修改LESS变量;

const CracoLessPlugin = require('craco-less');
module.exports = {
  plugins: [
    {
      plugin: CracoLessPlugin,
      options: {
        lessLoaderOptions: {
          lessOptions: {
            modifyVars: { '@primary-color': '#1DA57A' },
            javascriptEnabled: true,
          },
        },
      },
    },
  ],
}

引入antd的样式时,引入antd.less文件:

// import "antd/dist/antd.css";
import 'antd/dist/antd.less';

修改后重启 yarn start,如果看到一个绿色的按钮就说明配置成功了。


1.3.3. 配置别名


在项目开发中,某些组件或者文件的层级会较深,

  • 如果我们通过上层目录去引入就会出现这样的情况:../../../../components/button
  • 如果我们可以配置别名,就可以直接从根目录下面开始查找文件:@/components/button,甚至是:components/button

配置别名也需要修改webpack的配置,当然我们也可以借助于 craco 来完成:

...
const path = require("path");
const resolve = dir => path.resolve(__dirname, dir);
module.exports = {
  ...
  ,
  webpack: {
    alias: {
      '@': resolve("src"),
      'components': resolve("src/components"),
    }
  }
}

在导入时就可以按照下面的方式来使用了:

import HYCommentInput from '@/components/comment-input';
import HYCommentItem from 'components/comment-item';


二. AntDesign案例


我们通过AntDesign来编写一个案例:

image.png


2.1. 案例-评论框


我们选来完成评论框,评论框有两部分组成:

  • TextArea的输入框:Input.TextArea;
  • 提交评论的按钮:Button;
import React, { PureComponent } from 'react';
import moment from 'moment';
import {
  Form, Button, Input
} from 'antd';
export default class HYCommentInput extends PureComponent {
  constructor(props) {
    super(props);
    this.state = {
      value: ""
    }
  }
  render() {
    return (
      <div>
        <Input.TextArea rows={4} onChange={this.onChange.bind(this)} value={this.state.value} />
        <Button onClick={this.onSubmit.bind(this)} type="primary">
          添加评论
        </Button>
      </div>
    )
  }
  onChange(e) {
    this.setState({
      value: e.target.value
    })
  }
  onSubmit() {
    console.log(this.state.value, moment().fromNow());
    const commentInfo = {
      id: Date.now(),
      name: "coderwhy",
      avatar: "https://upload.jianshu.io/users/upload_avatars/1102036/c3628b478f06.jpeg?imageMogr2/auto-orient/strip|imageView2/1/w/240/h/240",
      content: <p>{this.state.value}</p>,
      datetime: moment()
    }
    this.props.submitComment(commentInfo);
    this.setState({
      value: ""
    });
  }
}


2.2. 案例-评论列表


评论列表主要是使用Comment组件,Comment组件有一些属性:

  • author:展示作者的名称;
  • avatar:展示作者的头像;
  • 可以使用Avatar的组件进行展示;
  • content:展示评论的内容;
  • datetime:展示评论的时间:
  • 这里我们可以使用Tooltip组件,当鼠标放在上面时,会显示对应的title内容;
  • actions:评论下方的操作按钮;
  • 这里我们可以使用DeleteOutlined,但是它来自 @ant-design/icons,需要我们进行安装;
import React, { PureComponent } from 'react';
import {
  Comment,
  Avatar,
  Tooltip
} from "antd";
import { DeleteOutlined } from "@ant-design/icons";
export default class HYCommentItem extends PureComponent {
  render() {
    const { comment } = this.props;
    return (
      <Comment
        author={<a href="/#">{comment.name}</a>}
        avatar={
          <Avatar
            src={comment.avatar}
            alt={comment.name}
          />
        }
        content={comment.content}
        datetime={
          <Tooltip title={comment.datetime.format('YYYY-MM-DD HH:mm:ss')}>
            <span>{comment.datetime.fromNow()}</span>
          </Tooltip>
        }
        actions={ this.getActions() }
      />
    )
  }
  getActions() {
    return [
      <span onClick={this.props.removeItem}><DeleteOutlined/> 删除</span>
    ]
  }
}


2.3. 案例-App组件


我们在App组件中,使用封装的两个组件:

import React, { PureComponent } from 'react';
import HYCommentInput from './components/comment-input';
import HYCommentItem from './components/comment-item';
export default class App extends PureComponent {
  constructor(props) {
    super(props);
    this.state = {
      commentList: []
    }
  }
  render() {
    return (
      <div style={{width: "500px", padding: "20px"}}>
        {
          this.state.commentList.map((item, index) => {
            return <HYCommentItem key={item.id} 
                                  comment={item} 
                                  index={index} 
                                  removeItem={e => this.removeItem(index)}/>
          })
        }
        <HYCommentInput submitComment={this.submitComment.bind(this)}/>
      </div>
    )
  }
  submitComment(comment) {
    this.setState({
      commentList: [...this.state.commentList, comment]
    })
  }
  removeItem(index) {
    const newCommentList = [...this.state.commentList];
    newCommentList.splice(index, 1);
    this.setState({
      commentList: newCommentList
    })
  }
}
相关文章
|
1月前
|
前端开发 JavaScript API
React开发需要了解的10个库
本文首发于微信公众号“前端徐徐”,介绍了React及其常用库。React是由Meta开发的JavaScript库,用于构建动态用户界面,广泛应用于Facebook、Instagram等知名网站。文章详细讲解了Axios、Formik、React Helmet、React-Redux、React Router DOM、Dotenv、ESLint、Storybook、Framer Motion和React Bootstrap等库的使用方法和应用场景,帮助开发者提升开发效率和代码质量。
115 4
React开发需要了解的10个库
|
7天前
|
人工智能 API Apache
推荐3款开源、美观且免费的WinForm UI控件库
推荐3款开源、美观且免费的WinForm UI控件库
|
1月前
|
前端开发 数据可视化 JavaScript
🚀打造卓越 UI:2024 年不容错过的 9 个 React UI 组件库✨
本文介绍了2024年最受欢迎的9个React UI组件库,每一个都在设计、功能和定制化上有独特的优势,包括Material UI、Ant Design、Chakra UI等。这些组件库为开发者提供了强大、灵活的工具,可以帮助构建现代化、无障碍且高效的Web应用程序。文章详细分析了每个库的特点、适用场景以及关键功能,帮助开发者在项目中做出最合适的选择,无论是打造企业级仪表板还是时尚的用户界面。
67 6
🚀打造卓越 UI:2024 年不容错过的 9 个 React UI 组件库✨
|
7天前
|
API C# 开发者
基于Material Design风格开源、免费的WinForms UI控件库
基于Material Design风格开源、免费的WinForms UI控件库!
|
1月前
|
资源调度 前端开发 JavaScript
React中classnames库使用
【10月更文挑战第7天】
|
20天前
|
资源调度 前端开发 JavaScript
React 测试库 React Testing Library
【10月更文挑战第22天】本文介绍了 React Testing Library 的基本概念和使用方法,包括安装、基本用法、常见问题及解决方法。通过代码案例详细解释了如何测试 React 组件,帮助开发者提高应用质量和稳定性。
32 0
|
2月前
|
前端开发
React技术栈-react使用的Ajax请求库实战案例
这篇文章介绍了在React应用中使用Axios和Fetch库进行Ajax请求的实战案例,展示了如何通过这些库发送GET和POST请求,并处理响应和错误。
55 10
React技术栈-react使用的Ajax请求库实战案例
|
2月前
|
前端开发
React技术栈-react使用的Ajax请求库用户搜索案例
这篇文章展示了一个React技术栈中使用Ajax请求库(如axios)进行用户搜索的实战案例,包括React组件的结构、状态管理以及如何通过Ajax请求获取并展示GitHub用户数据。
33 7
React技术栈-react使用的Ajax请求库用户搜索案例
|
2月前
|
前端开发 JavaScript
React技术栈-React UI之ant-design使用入门
关于React技术栈中使用ant-design库的入门教程,包括了创建React应用、搭建开发环境、配置按需加载、编写和运行代码的步骤,以及遇到错误的解决方法。
38 2
React技术栈-React UI之ant-design使用入门
|
1月前
|
Linux C# Android开发
分享3款开源、免费的Avalonia UI控件库
分享3款开源、免费的Avalonia UI控件库
125 0