美文网首页
[react]17、AntDesign

[react]17、AntDesign

作者: 史记_d5da | 来源:发表于2021-11-13 23:09 被阅读0次

1、React中添加class

在React中可以借助于一个第三方的库:classnames
添加命令:yarn add classnames

// 传统写法
<h2 className={"aa bb"}>标题1</h2>
<h2 className={"title" + (isActive ? "active" : "")}>标题2</h2>
<h2 className={["title" + (isActive ? "active" : "").join("")]}>标题3</h2>
// classNames写法
<h2 className={"aa bb"}>标题1</h2>
<h2 className={classNames("aa", "bb")}>标题2</h2>
<h2 className={classNames({"active": isActive, "show": isShow }, "title")}>标题3</h2>
<h2 className={classNames([{"active": isActive, "show": isShow }, "title"])}>标题4</h2>

2、AntDesign

1、AntDesign ,简称 antd 是基于 Ant Design 设计体系的 React UI 组件库,主要用于研发企业级中后台产品
中后台的产品 属于工具性产品,很多优秀的设计团队通过自身的探索和积累,形成了自己的设计体系
antd 的 JS 代码默认支持基于 ES modules 的 tree shaking,对于 js 部分,直接引入 import { Button } from 'antd' 就会有按需加载的效果。
AntDesign的特点:

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

全链路开发和设计
从业务战略—用户场景—设计目标—交互体验—用户流程—预期效率全方面进行分析和考虑
安装命令:yarn add antd
样式导入

import 'antd/dist/antd.css'
import 'antd/dist/antd.less'
import 'moment/locale/zh-cn'

3、craco

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

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

修改默认配置,社区目前有两个比较常见的方案

  • react-app-rewired + customize-cra
  • craco

第一步:安装craco:yarn add @craco/craco
第二步:修改package.json文件
原本启动时,我们是通过react-scripts来管理的;
现在启动时,我们通过craco来管理;

"scripts": {
  "start": "craco start",
  "build": "craco build",
  "test": "craco test",
  "eject": "react-scripts eject"
},

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

const CracoLessPlugin = require('craco-less');
const path = require("path");
const resolve = dir => path.resolve(__dirname, dir)
module.exports = {
    plugins: [
        {
          plugin: CracoLessPlugin,
          options: {
            lessLoaderOptions: {
              lessOptions: {
                modifyVars: { '@primary-color': '#FD4B80' },
                javascriptEnabled: true,
              },
            },
          },
        },
      ]
}

4、配置主题

按照 配置主题 的要求,自定义主题需要用到类似 less-loader 提供的 less 变量覆盖功能
引入 craco-less 来帮助加载 less 样式和修改变量
安装 craco-less: yarn add craco-less
修改craco.config.js中的plugins:
使用modifyVars可以在运行时修改LESS变量;
引入antd的样式时,引入antd.less文件:import 'antd/dist/antd.less';
修改后重启 yarn start,如果看到一个绿色的按钮就说明配置成功了

5、配置别名

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

  • 如果我们通过上层目录去引入就会出现这样的情况:../../../../components/button
  • 如果我们可以配置别名,就可以直接从根目录下面开始查找文件:@/components/button,甚至是:components/button;
const CracoLessPlugin = require('craco-less');
const path = require("path");
const resolve = dir => path.resolve(__dirname, dir); // __dirname当前文件所在路径
module.exports = {
    webpack: {
      alias: {
        "@": resolve("src"),
        "components": resolve("src/components")
      }
    }
}

6、案例

实现评论效果

// CommentInput.js
import React, { PureComponent } from 'react'
import {Input, Button} from 'antd'
import moment from 'moment'

export default class CommentInput extends PureComponent {
    constructor(props) {
        super(props);
        this.state = {
            content: ""
        }
    }
    render() {
        return (
            <div style={{width: "500px"}}>
                {'CommentInput'}
                <Input.TextArea rows={4}
                                value={this.state.content}
                                onChange={e => this.handleValueChange(e)}/>
                <Button type={"primary"} onClick={e => this.addComment()}>添加评论</Button>
            </div>
        )
    }

    addComment() {
        console.log(this.state.content)
        const contentInfo = {
            id: moment().valueOf(),
            avater: "https://upload.jianshu.io/users/upload_avatars/13018511/c399c180-901c-4f47-956c-26de18ac5abf?imageMogr2/auto-orient/strip|imageView2/1/w/240/h/240",
            nickname: "coderwhy",
            datetime: moment().format(),
            content: this.state.content
        }

        this.props.submitcomment(contentInfo);

        this.setState({
            content: ""
        })
    }

    handleValueChange(e) {
        this.setState({
            content: e.target.value
        })
    }
}
// CommentItem.js
import React, { PureComponent } from 'react'
import {Comment, Avatar, Tooltip, Button} from 'antd'
import moment from 'moment'
import {DeleteOutlined} from '@ant-design/icons'

export default class CommentItem extends PureComponent {
    render() {
        const {content, nickname, avatar, datetime} = this.props.comment
        return (
            <Comment
                author={nickname}
                avatar={
                    <Avatar
                    src={avatar}
                    alt="Han Solo"
                    />
                }
                content={
                    <p>
                    {content}
                    </p>
                }
                datetime={
                    <Tooltip title={moment().format('YYYY-MM-DD HH:mm:ss')}>
                        <span>{datetime}</span>
                    </Tooltip>
                }

                actions={[
                    <span onClick={e => this.removeItem()}><DeleteOutlined/>删除</span>
                ]}
            />
        )
    }

    removeItem() {
        this.props.removeItem();
    }
}
// App.js
import React, { PureComponent } from 'react'
import CommentInput from './components/CommentInput'
import CommentItem from './components/CommentItem'

export default class App extends PureComponent {
    constructor(props) {
        super(props);
        this.state = {
            contentList: []
        }
    }
    render() {
        return (
            <div style={{width: "500px", padding: "20px"}}>
                {
                    this.state.contentList.map((item, index) => {
                        return (<CommentItem comment={item} key={item.id} removeItem={e => this.removeItem(index)}/>)
                    })
                }
                <CommentInput submitcomment={this.submitcomment.bind(this)}/>
            </div>
        )
    }

    submitcomment(info) {
        console.log(info);
        this.setState({
            contentList: [...this.state.contentList, info]
        })
    }

    removeItem(index) {
        const newCommentList = [...this.state.contentList]
        newCommentList.splice(index, 1)
        this.setState({
            contentList: newCommentList
        })
    }
}

相关文章

网友评论

      本文标题:[react]17、AntDesign

      本文链接:https://www.haomeiwen.com/subject/czczzltx.html