react集合antd实现选择的开始和结束时间范围为一周内

借鉴Antd日期选择器实现开始时间和结束时间无论怎么去选都是一周内。
参考链接:https://ant.design/components/date-picker-cn/

需求:因超过一周的数据量过大会导致接口返回异常,需处理传参时间为最多一周内
用户可以选择任意时间为开始/结束时间,但是时间范围为一周内

结合Antd提及的日期选择框的DatePicker两个小框,因为antd中的RangePicker是连框,校验起来也可以根据rules提示信息但是体验不是很好,所以修改时间为DatePicker
实现效果如下: 开始时间和结束时间无论怎么去选都是一周内
在这里插入图片描述
在这里插入图片描述

import React from "react";
import ReactDOM from "react-dom";
import "antd/dist/antd.css";
import "./index.css";
import { Form, DatePicker, Button } from "antd";

class TimeRelatedForm extends React.Component {
  state = {
    startValue: null,
    endValue: null,
    endOpen: false
  };

  disabledStartDate = startValue => {
    const { endValue } = this.state;
    if (!startValue || !endValue) {
      return false;
    }
    return (
      startValue.valueOf() < endValue.valueOf() - 604800000 ||
      startValue.valueOf() > endValue.valueOf()
    );
  };

  disabledEndDate = endValue => {
    const { startValue } = this.state;
    if (!endValue || !startValue) {
      return false;
    }
    return (
      endValue.valueOf() > startValue.valueOf() + 604800000 ||
      endValue.valueOf() < startValue.valueOf()
    );
  };

  onEndChange = value => {
    this.onChange("endValue", value);
  };

  handleEndOpenChange = open => {
    this.setState({ endOpen: open });
  };

  handleSubmit = e => {
    e.preventDefault();
    this.props.form.validateFields((err, fieldsValue) => {
      if (err) {
        return;
      }

      // Should format date value before submit.
      const values = {
        ...fieldsValue,
        startTime: fieldsValue["date-time-picker"].format(
          "YYYY-MM-DD HH:mm:ss"
        ),
        endTime: fieldsValue["date-time-picker2"].format("YYYY-MM-DD HH:mm:ss")
      };
      console.log("Received values of form: ", values);
    });
  };

  onStartChange = value => {
    this.onChange("startValue", value);
  };

  onChange = (field, value) => {
    this.setState({
      [field]: value
    });
  };

  handleStartOpenChange = open => {
    if (!open) {
      this.setState({ endOpen: true });
    }
  };

  render() {
    const { getFieldDecorator } = this.props.form;
    const { startValue, endValue, endOpen } = this.state;
    const formItemLayout = {
      labelCol: {
        xs: { span: 24 },
        sm: { span: 8 }
      },
      wrapperCol: {
        xs: { span: 24 },
        sm: { span: 16 }
      }
    };
    const config = {
      rules: [{ required: true, message: "Please select time!" }]
    };

    const config1 = {
      rules: [{ required: true, message: "Please select time!" }]
    };

    return (
      <Form {...formItemLayout} onSubmit={this.handleSubmit}>
        <Form.Item label="DatePicker[showTime]">
          {getFieldDecorator("date-time-picker", config)(
            <DatePicker
              disabledDate={this.disabledStartDate}
              showTime
              format="YYYY-MM-DD HH:mm:ss"
              value={startValue}
              placeholder="Start"
              onChange={this.onStartChange}
              onOpenChange={this.handleStartOpenChange}
            />
          )}

          {getFieldDecorator("date-time-picker2", config1)(
            <DatePicker
              disabledDate={this.disabledEndDate}
              value={endValue}
              placeholder="End"
              onChange={this.onEndChange}
              open={endOpen}
              onOpenChange={this.handleEndOpenChange}
              showTime
              format="YYYY-MM-DD HH:mm:ss"
            />
          )}
        </Form.Item>

        <Form.Item
          wrapperCol={{
            xs: { span: 24, offset: 0 },
            sm: { span: 16, offset: 8 }
          }}
        >
          <Button type="primary" htmlType="submit">
            Submit
          </Button>
        </Form.Item>
      </Form>
    );
  }
}

const WrappedTimeRelatedForm = Form.create({ name: "time_related_controls" })(
  TimeRelatedForm
);

ReactDOM.render(
  <WrappedTimeRelatedForm />,
  document.getElementById("container")
);
React项目中使用Ant Design (antd) 库可以非常方便地实现标签页(Tabs)和表单(Form)组件。以下是实现这些功能的基本步骤和代码示例: 1. **实现Tabs(标签页)**: 使用antd的`Tabs`组件,你可以快速创建一个标签页布局。你需要先导入`Tabs`组件,并在你的React组件中使用它。 ```jsx import { Tabs } from 'antd'; const { TabPane } = Tabs; class MyTabsComponent extends React.Component { render() { return ( <Tabs type="card"> <TabPane tab="Tab 1" key="1"> Content of Tab 1 </TabPane> <TabPane tab="Tab 2" key="2"> Content of Tab 2 </TabPane> </Tabs> ); } } ``` 2. **实现Form(表单)**: 对于表单,你需要使用antd的`Form`、`Input`等表单控件组件。创建一个表单首先需要导入`Form`组件,并设置表单的`initialValues`和`onFinish`事件处理函数。 ```jsx import { Form, Input, Button, message } from 'antd'; const { Item } = Form; class MyFormComponent extends React.Component { handleSubmit = (values) => { console.log('Received values of form: ', values); // 处理表单提交逻辑 message.success('Submit successfully!'); } render() { return ( <Form onFinish={this.handleSubmit}> <Item name="username" rules={[{ required: true, message: 'Please input your username!' }]}> <Input placeholder="Username" /> </Item> <Item name="password" rules={[{ required: true, message: 'Please input your password!' }]}> <Input.Password placeholder="Password" /> </Item> <Item> <Button type="primary" htmlType="submit"> Submit </Button> </Item> </Form> ); } } ``` 3. **表单提交**: 表单提交通常通过绑定`onFinish`事件来实现。在该事件处理函数中,你可以获取到用户输入的数据,并进行相应的逻辑处理,比如发送请求到服务器。 在上述示例中,`handleSubmit`方法会在表单提交时被调用,可以在这里添加你的提交逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值