来源: coderwhy
对于学习过程,不是特别建议从一开始就使用别人的第三方库UI库,更重要的是要学会组件化相关的知识(就像前面我们已经讲了非常相关知识),之后自己来封装、设计一套自己的可复用组件。
但是在公司开发为了开发效率,我们往往也会选择一些非常优秀的第三方UI库,而AntDesign就是这样的一套优秀的UI组件库。
一. 认识AntDesign
1.1. AntDesign的介绍
AntDesign ,简称 antd 是基于 Ant Design 设计体系的 React UI 组件库,主要用于研发企业级中后台产品。
AntDesign的特点:
- 提炼自企业级中后台产品的交互语言和视觉风格。
- 开箱即用的高质量 React 组件。
- 使用 TypeScript 开发,提供完整的类型定义文件。
- ?? 全链路开发和设计工具体系。
- 数十个国际化语言支持。
- 深入每个细节的主题定制能力。
全链路开发和设计指的是什么?
- 全链路这个词我记得是16年左右阿里提出的;
- 从业务战略—用户场景—设计目标—交互体验—用户流程—预期效率全方面进行分析和考虑;
- 这个主要是产品经理会考虑的一个点;
AntDesign的兼容性:
- 现代浏览器和 IE11(需要 polyfills)。
- 支持服务端渲染。
- Electron
浏览器兼容
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中就可以使用一些组件了:
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-20200706111432484
1.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?(
??????
????????
????????
??????
????)
??}
??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:?{this.state.value}
,
??????datetime:?moment()
????}
????this.props.submitComment(commentInfo);
????this.setState({
??????value:?""
????});
??}
}
1.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.name}}
????????avatar={
??????????
????????}
????????content={comment.content}
????????datetime={
??????????
????????????{comment.datetime.fromNow()}
??????????
????????}
????????actions={?this.getActions()?}
??????/>
????)
??}
??getActions()?{
????return?[
?????? ?删除
????]
??}
}
1.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?(
??????
????????{
??????????this.state.commentList.map((item,?index)?=>?{
????????????return??this.removeItem(index)}/>
??????????})
????????}
????????
??????
????)
??}
??submitComment(comment)?{
????this.setState({
??????commentList:?[...this.state.commentList,?comment]
????})
??}
??removeItem(index)?{
????const?newCommentList?=?[...this.state.commentList];
????newCommentList.splice(index,?1);
????this.setState({
??????commentList:?newCommentList
????})
??}
}
我是@半糖学前端 ,专注前端技术领域分享,一个资深前端开发者,关注我和我一起学习,共同进步。
Tags:less变量