我是靠谱客的博主 贤惠抽屉,最近开发中收集的这篇文章主要介绍antd学习之Calendar,Upload上传,table,RangePicker,Cascader日历,Timeline时间轴,checkbox,modal,TimePicker,TreeSele,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

antd学习之Calendar,Upload上传,table,RangePicker,Cascader日历,Timeline时间轴,checkbox,modal,TimePicker,TreeSelect,InputNumber

  • 官网

Ant Design of React - Ant Design

  • 下载
npm install antd
  • 样式引入
import "antd/dist/antd.css";
  • select
import React, { Component } from "react";
import { Select } from "antd";
import "antd/dist/antd.css";
class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
    }
    this.onSelectChange = this.onSelectChange.bind(this);
  }
  onSelectChange(value) {
    console.log("value", value)
  }
  render() {
    const { Option } = Select;
    return (
      <Select
        onChange={this.onSelectChange}
        className="bli_Select"
        showSearch
        //placeholder="Select SiteId"
        defaultValue="all"
        optionFilterProp="children"
        filterOption={(input, option) =>
          option.props.children
            .toLowerCase()
            .indexOf(input.toLowerCase()) >= 0
        }
      >
        {this.props.filterGroup &&
          this.props.filterGroup.map((group, i) => {
            return (
              <Option value={group} key={"group" + i}>
                {group}
              </Option>
            );
          })}
      </Select>
    );
  }
}
export default App;
  • DatePicker

1.学习网址:DatePicker - Ant Design

2.代码

import React, { Component } from "react";
import { DatePicker } from "antd";
import moment from "moment";
class App extends Component {
  constructor(props) {
    super(props);
    this.onChangeTime = this.onChangeTime.bind(this);
  }
  onChangeTime(value, dateString) {
    console.log("Selected Time: ", value);
    console.log("Formatted Selected Time: ", dateString);
  }
  render() {
    const { RangePicker } = DatePicker;
    return (
      <RangePicker
        showTime={{
          hideDisabledOptions: true,
          defaultValue: [
            moment("00:00:00", "HH:mm:ss"),
            moment("11:59:59", "HH:mm:ss")
          ]
        }}
        onChange={this.onChangeTime}
        format="YYYY-MM-DD HH:mm:ss"
      />
    );
  }
}
export default App;

3.效果图

       

DatePicker和MonthPicker设置默认值

<MonthPicker onChange={this.onChangeEndDate} value={moment(this.state.endDate, "YYYY-MM")}/>

4.引入MonthPicker

如下代码引入日历组件中选择月份可能会由于react和reactDom版本原因而失效

<DatePicker onChange={onChange} picker="month" />

所以,需要引入MonthPicker

render下方

const {MonthPicker} = DatePicker

然后

<MonthPicker onChange={this.onChangeStartDate} />

5、清空之后 显示Invalid date

在这里插入图片描述

在日期选择框中进行判断


       <DatePicker
                    style={{ width: '110px' }}
                    placeholder="开始日期"
                    onChange={this.handleStartDate}
                    value={
                      startDate === undefined ? startDate : moment(startDate, 'YYYY-MM-DD')
                    }
                    format="YYYY-MM-DD"
                  />~

  • Calendar

1.效果图

2.学习网址

日历 Calendar - Ant Design

3.代码

import React, { Component } from 'react';
import { Calendar } from 'antd';
import './App.css';
import 'antd/dist/antd.css';
class App extends Component {
  render() {
    return (
        <Calendar onSelect={this.onSelect}/>
    );
  }
}

export default App;
  • Upload上传

1.学习网站:上传 Upload - Ant Design

2.效果图:

3.代码:

import React, { Component } from 'react';
import {
  Upload, message, Button, Icon,
} from 'antd';
import './App.css';
import 'antd/dist/antd.css';
const Dragger = Upload.Dragger;//demo2
const props = {
  name: 'file',
  multiple: true,//demo2
  action: '//jsonplaceholder.typicode.com/posts/',
  headers: {
    authorization: 'authorization-text',
  },
  onChange(info) {
    if (info.file.status !== 'uploading') {
      console.log(info.file, info.fileList);
    }
    if (info.file.status === 'done') {
      message.success(`${info.file.name} file uploaded successfully`);
    } else if (info.file.status === 'error') {
      message.error(`${info.file.name} file upload failed.`);
    }
    //demo2
    const status = info.file.status;
    if (status !== 'uploading') {
      console.log(info.file, info.fileList);
    }
    if (status === 'done') {
      message.success(`${info.file.name} file uploaded successfully.`);
    } else if (status === 'error') {
      message.error(`${info.file.name} file upload failed.`);
    }
  },
};
class App extends Component {
  render() {
    return (
      <div>
        <div className="uploadbox">
          <Upload {...props}>
            <Button>
              <Icon type="upload" /> Click to Upload
          </Button>
          </Upload>
        </div>
        <div className="uploadbox">
          <Dragger {...props}>
            <p className="ant-upload-drag-icon">
              <Icon type="inbox" />
            </p>
            <p className="ant-upload-text">Click or drag file to this area to upload</p>
            <p className="ant-upload-hint">本地文件服务</p>
          </Dragger>
        </div>
      </div>
    );
  }
}

export default App;
.uploadbox{
  width: 520px;height: 150px;text-align: center;
  margin-right: 20px;float: left;
}

3、上传图片代码示例

遇见如下问题:解决办法是,fileList的图片uid不能设置成相同的。因为这个组件循环多少次是根据fileList的长度来遍历,而图片uid相当于遍历组件的key

import './App.css';
import React, { Component } from 'react'
import { Upload } from 'antd';
import ImgCrop from 'antd-img-crop';
import "antd/dist/antd.css";
class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      fileList: [{
        uid: '1',
        name: 'image.png',
        status: 'done',
        url: 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png',
        key:"first"
      },
      {
        uid: '2',
        name: 'image.png',
        status: 'done',
        url: 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png',
        key:"second"
      },
      {
        uid: '3',
        name: 'image.png',
        status: 'done',
        url: 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png',
        key:"third"
      },
      {
        uid: '4',
        name: 'image.png',
        status: 'done',
        url: 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png',
        key:"forth"
      },
      {
        uid: '5',
        name: 'image.png',
        status: 'done',
        url: 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png',
        key:"fiveth"
      },
      {
        uid: '6',
        name: 'image.png',
        status: 'done',
        url: 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png',
        key:"sixth"
      },
      {
        uid: '7',
        name: 'image.png',
        status: 'done',
        url: 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png',
        key:"seventh"
      },
      {
        uid: '8',
        name: 'image.png',
        status: 'done',
        url: 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png',
        key:"eighth"
      },
      {
        uid: '9',
        name: 'image.png',
        status: 'done',
        url: 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png',
        key:"nineth"
      }
    ],
      
    }
  }
  onChange = (value) => {
    console.log("value====",value)
    this.setState({fileList:value.fileList})
    // if (newFileList.file.status === 'uploading') {
    //   // setLoading(true);
    //   return;
    // }
    // // setLoading(false);
    // if (newFileList.file.status === 'done') {
    //   // if (newFileList.file.response && newFileList.file.response.code !== 0) {
    //   //   message.error('上传文件错误:' + newFileList.file.response.message);
    //   //   return;
    //   // }
    //   // console.log("newFileList",newFileList)
    // }
    // if(value.file.status === "removed"){
    // }
  };
  onPreview = async file => {
    let src = file.url;
    if (!src) {
      src = await new Promise(resolve => {
        const reader = new FileReader();
        reader.readAsDataURL(file.originFileObj);
        reader.onload = () => resolve(reader.result);
      });
    }
    const image = new Image();
    image.src = src;
    const imgWindow = window.open(src);
    imgWindow.document.write(image.outerHTML);
  };
  render() {
    return (
      <div className="App">
        <ImgCrop rotate >
          <Upload
            action="https://www.mocky.io/v2/5cc8019d300000980a055e76" listType="picture-card" fileList={this.state.fileList}
            onChange={(value)=>this.onChange(value)} onPreview={this.onPreview}
          >
            {this.state.fileList.length!== 9 && '+ Upload'}
          </Upload>
          <div>此处想要显示key值</div>
        </ImgCrop>
      </div>
    );
  }
}

export default App;

showUploadList={{ showRemoveIcon: false }} //隐藏删除按钮

  • table

1.学习网站:表格 Table - Ant Design

若数据是record内的一个object里的值,类似:node.attributeSets.edges

{

title: <FormattedMessage id="goods.spu.title.name" />,

dataIndex: ['node', 'nameIntl'],

align: 'left',

render: nameIntl => <span>{getText(nameIntl)}</span>,

},

{

title: <FormattedMessage id="goods.spu.title.type" />,

dataIndex: ['node', 'attributeSets', 'edges'],

align: 'left',

render: attributeSets => renderSpuType(attributeSets),

},

2、合并行

const getRowSpans = (arr, key) => {
    let sameValueLength = 0;
    const rowSpans = [];
    for (let i = arr.length - 1; i >= 0; i--) {
      if (i === 0) {
        rowSpans[i] = sameValueLength + 1;
        continue;
      }
      if (arr[i][key] === arr[i - 1][key]) {
        rowSpans[i] = 0;
        sameValueLength++;
      } else {
        console.log(sameValueLength);
        rowSpans[i] = sameValueLength + 1;
        sameValueLength = 0;
      }
    }
    return rowSpans;
  };
const tableData = [...省略]
const rowSpans = getRowSpans(tableData, 'name');
const columns = [
    {
      title: '配置项',
      dataIndex: 'name',
      render: (value, _, index) => {
        const obj = {
          children: value,
          props: {},
        };

        obj.props.rowSpan = rowSpans[index];
        return obj;
      },
    },
]

3、固定表头

        <Table
          ...
          scroll={{ y: 240 }}
        />

四、RangePicker

1.学习网站:日期选择框 DatePicker - Ant Design

  • Cascader

1.学习网站:级联选择 Cascader - Ant Design

2.效果图如下:

3.代码如下:

import React, { Component } from 'react';
import { Cascader, DatePicker } from 'antd';
import './App.css';
import 'antd/dist/antd.css';
const addressdData = [{
  value: 'zhejiang',
  label: 'Zhejiang',
  children: [{
    value: 'hangzhou',
    label: 'Hangzhou',
    children: [{
      value: 'xihu',
      label: 'West Lake',
    }],
  }],
}, {
  value: 'jiangsu',
  label: 'Jiangsu',
  children: [{
    value: 'nanjing',
    label: 'Nanjing',
    children: [{
      value: 'zhonghuamen',
      label: 'Zhong Hua Men',
    }],
  }],
}];
function onChange(date, dateString) {
  console.log(date, dateString);
}
const { RangePicker } = DatePicker;
class App extends Component {
  render() {
    return (
      <div>
        <Cascader style={{ width: '100%',marginBottom:30}} options={addressdData} placeholder="Select Address" onChange={onChange} />
        <RangePicker style={{ width: '100%' }} onChange={onChange} />
      </div>
    );
  }
}

export default App;

antd的面包屑,progress,Timeline,还有手风琴效果不错,可以应用到自己的项目中,具体使用看教程

  • Timeline时间轴

import React, { Component } from 'react';
import { Timeline , Icon} from 'antd';
import './App.css';
import 'antd/dist/antd.css';
import img2 from './2.jpeg'
class App extends Component {
  render() {
    return (
		<Timeline>
		<Timeline.Item color="green">Create a services site 2015-09-01</Timeline.Item>
		<Timeline.Item color="green">Create a services site 2015-09-01</Timeline.Item>
		<Timeline.Item color="red">
		  <p>Solve initial network problems 1</p>
		  <p>Solve initial network problems 2</p>
		  <p>Solve initial network problems 3 2015-09-01</p>
		</Timeline.Item>
		<Timeline.Item>
		  <p>Technical testing 1</p>
		  <p>Technical testing 2</p>
		  <p>Technical testing 3 2015-09-01</p>
		</Timeline.Item>
		<Timeline.Item dot={<Icon type="clock-circle-o" style={{ fontSize: '16px' }} />}>
		    <p>Technical testing 2015-09-01</p>
			<img src={img2} alt="no img" />
		</Timeline.Item>
	  </Timeline>
    );
  }
}

export default App;
  • checkbox

import React, { Component } from "react";
import { Checkbox } from 'antd';
import "antd/dist/antd.css";
import "./App.css"
const CheckboxGroup = Checkbox.Group;
const plainOptions = ['Apple', 'Pear', 'Orange'];
const defaultCheckedList = ['Apple', 'Orange'];
class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      checkedList: defaultCheckedList,
      indeterminate: true,
      checkAll: false,
    };
  }
  onChange = checkedList => {
    this.setState({
      checkedList,
      indeterminate: !!checkedList.length && checkedList.length < plainOptions.length,
      checkAll: checkedList.length === plainOptions.length,
    });
  };

  onCheckAllChange = e => {
    this.setState({
      checkedList: e.target.checked ? plainOptions : [],
      indeterminate: false,
      checkAll: e.target.checked,
    });
  };
  render() {
    return (
      <div>
        <div className="check_all_box">
          <Checkbox
            indeterminate={this.state.indeterminate}
            onChange={this.onCheckAllChange}
            checked={this.state.checkAll}
          >
            Check all
          </Checkbox>
        </div>
        <CheckboxGroup
          options={plainOptions}
          value={this.state.checkedList}
          onChange={this.onChange}
          className="check_group_box"
        />
      </div>
    );
  }
}
export default App;

App.css

.check_all_box{margin-left: 5px;}
.ant-checkbox-group-item{display: block!important;}
.check_group_box{margin-left: 30px;}
  • modal

import React, { Component } from "react";
import { Modal as AntdModal } from "antd";
import "antd/dist/antd.css";
class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
    }
  }
  error = () => {
    AntdModal.info({
      title: "Incomplete Fields",
      content: "Please complete all required fields.",
      centered: true
    });
  };
  handleNext = () => {
    if(...){
        this.error();
        return;
    }
  }
  render() {
    return (
      <div onClick={this.handleNext}>123</div>
    );
  }
}
export default App;
  • Collapse

import React, { Component } from "react";
import { Collapse } from 'antd';
import "antd/dist/antd.css";
import "./App.css"
class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
    }
  }
  render() {
    const { Panel } = Collapse;
    const text = `
      A dog is a type of domesticated animal.
      Known for its loyalty and faithfulness,
      it can be found as a welcome guest in many households across the world.
    `;
    return (
      <Collapse
        bordered={true}
        defaultActiveKey={['1', '2', '3']}
        ghost
        expandIconPosition={'right'}
      >
        <Panel header="" key="1" 
        className="collapse_box">
          <p>{text}</p>
        </Panel>
        <Panel header="" key="2" 
        className="collapse_box">
          <p>{text}</p>
        </Panel>
        <Panel header="" key="3"
        className="collapse_box">
          <p>{text}</p>
        </Panel>
      </Collapse>
    );
  }
}
export default App;
.collapse_box{border-radius: .28571429rem;margin: 50px 50px!important;
  border: 1px solid rgba(34,36,38,.15);box-shadow: 0 1px 2px 0 rgba(34,36,38,.15);}
  • Steps

两种方法

方法一:

import React, { Component } from "react";
import './App.css';
import { Steps } from "antd";
import "antd/dist/antd.css";
const Step = Steps.Step;
const steps = [{
  title: '第一步',
  description: '描述一'
}, {
  title: '第二步',
  description: '描述二'
}, {
  title: '第三步',
  description: '描述三'
}].map((s, i) => <Step key={i} title={s.title} description={s.description} />);
class App extends Component {
  render() {
    return (
      <div className="App">
        <Steps current={1}>{steps}</Steps>
      </div>
    );
  }
}
export default App;

方法二:

import React, { Component } from "react";
import './App.css';
import { Steps } from "antd";
import "antd/dist/antd.css";
class App extends Component {
  render() {
    return (
      <div className="App">
        <Steps current={1}>
          <Steps.Step title="第一步" description="描述一"></Steps.Step>
          <Steps.Step title="第二步" description="描述二"></Steps.Step>
          <Steps.Step title="第三步" description="描述三"></Steps.Step>
        </Steps>
      </div>
    );
  }
}
export default App;

实际项目中使用

import React, { Component } from "react";
import StepOne from "./stepOne";
import StepTwo from "./stepTwo";
import StepThree from "./stepThree";
import { Steps, Button } from "antd";
import "antd/dist/antd.css";
function getSteps() {
  return [
    "step one",
    "step two",
    "step three"
  ];
}
class App extends Component {
  state = {
    activeStep: 0
  };
  getStepContent(stepIndex) {
    switch (stepIndex) {
      case 0:
        return <StepOne />;
      case 1:
        return <StepTwo />;
      case 2:
        return <StepThree />;
      default:
        return "Unknown stepIndex";
    }
  }
  handleNext = () => {
    if (this.state.state === 2) {
      this.setState({ activeStep: 0 })
    } else {
      this.setState({ activeStep: this.state.activeStep + 1 })
    }
  };
  handleBack = () => {
    this.setState({ activeStep: this.state.activeStep - 1 })

  };
  render() {
    const steps = getSteps();
    const { activeStep } = this.state;
    return (
      <div style={{ paddingTop: 70 }}>
        <Steps size="small" current={activeStep}>
          {steps.map(label => (
            <Steps.Step key={label} title={label}></Steps.Step>
          ))}
        </Steps>
        <div>
          {this.getStepContent(activeStep)}
          {
            activeStep > 0 && activeStep <= 2 ?
              <Button
                disabled={activeStep === 0}
                onClick={this.handleBack}
              >
                Back
              </Button> : null
          }
          <Button
            variant="contained"
            color="primary"
            onClick={this.handleNext}
          >
            {activeStep === 2
              ? "Finish"
              : "Next"}
          </Button>
        </div>
      </div>
    );
  }
}
export default App;

stepOne;stepTwo;stepThree这三个页面这里就不展示了,省略

  • TimePicker

 注意:回显的时间需要用moment包裹:moment(时间值, 'HH:mm:ss');



useEffect(() => {
newTableData[7]['value'].time = moment(data?.d0WithdrawStartTime, 'HH:mm:ss');
},[])

 
function onChangeTime(e, key) {
}


<TimePicker
     value={text.time}
     onChange={(e) => onChangeTime(e, record.key)}
    format={'HH:mm:ss'}
    placeholder="选择时间"
      disabled={record.disabled}
/>


              <TimePicker.RangePicker
                value={[
                  text?.time[0] ? moment(text.time[0], 'HH:mm') : undefined,
                  text?.time[1] ? moment(text.time[1], 'HH:mm') : undefined,
                ]}
                format={'HH:mm'}
                onChange={(e) => onChangeTime(e, record.key)}
                placeholder={["选择时间", "选择时间"]}
              />
  • TreeSelect

          <TreeSelect
            disabled={JSON.stringify(props.values) !== '{}'}
            showSearch            //显示搜索框
            treeNodeFilterProp="title"    //输入项过滤对应的 treeNode 属性, value或者title.官网解释说,输入项过滤对应的 treeNode 属性,默认是value,
            style={{ width: '100%' }}
            value={value}
            dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
            placeholder="点击选择上级服务商"
            allowClear
            treeData={props?.agentTree}
            fieldNames={{
              label: 'agentName',
              key: 'agentCode',
              value: 'agentCode',
              children: 'childList',
            }}
            treeDefaultExpandAll
          ></TreeSelect>
  • InputNumber
  //截取部分函数
  //限制输入框只能输入整数
  const onlyIntegers = (value) => {
    return value.replace(/^(0+)|[^d]/g, '');
  };

  //限制输入框只能输入两位小数
  const limitDecimals = (value) => {
    return value.replace(/^(-)*(d+).(dd).*$/, '$1$2.$3');
  };


            //截图部分return内的代码
            <InputNumber
              key={record.key}
              min={minDefaultValue}
              max={maxDefaultValue}
              value={text}
              onChange={(e) => onChange(e, record.key)}
              step={maxDefaultValue == 9999 ? 1 : 0.01}
              stringMode
              formatter={maxDefaultValue == 1 ? limitDecimals : onlyIntegers}
              parser={maxDefaultValue == 1 ? limitDecimals : onlyIntegers}
            />

最后

以上就是贤惠抽屉为你收集整理的antd学习之Calendar,Upload上传,table,RangePicker,Cascader日历,Timeline时间轴,checkbox,modal,TimePicker,TreeSele的全部内容,希望文章能够帮你解决antd学习之Calendar,Upload上传,table,RangePicker,Cascader日历,Timeline时间轴,checkbox,modal,TimePicker,TreeSele所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部