Antd的RangePicker选择7天时间段的示例放到Form中该怎么写?

https://4x-ant-design.antgroup.com/components/date-picker-cn/...

上面是antd的rangepicker选择7天时间段的例子。放到form中要怎么写呢?form劫持了value和onchange,导致和示例不一样

import { Button, DatePicker, Form, Input } from 'antd';
import { Dayjs } from 'dayjs';
import React, { useState } from 'react'


const { RangePicker } = DatePicker;

type RangeValue = [Dayjs | null, Dayjs | null] | null;

export default function FormDemo() {
  const [dates, setDates] = useState<RangeValue>(null);
  const [value, setValue] = useState<RangeValue>(null);

  const disabledDate = (current: Dayjs) => {
    if (!dates) {
      return false;
    }
    const tooLate = dates[0] && current.diff(dates[0], 'days') > 7;
    const tooEarly = dates[1] && dates[1].diff(current, 'days') > 7;
    return !!tooEarly || !!tooLate;
  };

  const onOpenChange = (open: boolean) => {
    if (open) {
      setDates([null, null]);
    } else {
      setDates(null);
    }
  };
  const onFinish = (values: any) => {
    console.log('Success:', values);
  };

  const onFinishFailed = (errorInfo: any) => {
    console.log('Failed:', errorInfo);
  };
  return (
    <div>
      <Form
        name="basic"
        labelCol={{ span: 8 }}
        wrapperCol={{ span: 16 }}
        onFinish={onFinish}
        onFinishFailed={onFinishFailed}
        autoComplete="off"
      >
        <Form.Item name="remember">
          <RangePicker
            value={dates || value}
            disabledDate={disabledDate}
            onCalendarChange={val => setDates(val)}
            onChange={val => setValue(val)}
            onOpenChange={onOpenChange}
            onBlur={() => console.log('blur has been triggered')}
          />
        </Form.Item>

        <Form.Item wrapperCol={{ offset: 8, span: 16 }}>
          <Button type="primary" htmlType="submit">
            Submit
          </Button>
        </Form.Item>
      </Form>
    </div>
  )
}
阅读 2.5k
1 个回答

你可以把RangePicker 的 value 和 onChange 事件通过 Form.Item 的 getValueProps 和 getValueFromEvent 进行处理:

import { Button, DatePicker, Form } from 'antd';
import { Dayjs } from 'dayjs';
import React, { useState } from 'react';

const { RangePicker } = DatePicker;
type RangeValue = [Dayjs | null, Dayjs | null] | null;

export default function FormDemo() {
  const [dates, setDates] = useState<RangeValue>(null);

  const disabledDate = (current: Dayjs) => {
    if (!dates) {
      return false;
    }
    const tooLate = dates[0] && current.diff(dates[0], 'days') > 7;
    const tooEarly = dates[1] && dates[1].diff(current, 'days') > 7;
    return !!tooEarly || !!tooLate;
  };

  const onOpenChange = (open: boolean) => {
    if (open) {
      setDates([null, null]);
    } else {
      setDates(null);
    }
  };

  const onFinish = (values: any) => {
    console.log('Success:', values);
  };

  const onFinishFailed = (errorInfo: any) => {
    console.log('Failed:', errorInfo);
  };

  return (
    <div>
      <Form
        name="basic"
        labelCol={{ span: 8 }}
        wrapperCol={{ span: 16 }}
        onFinish={onFinish}
        onFinishFailed={onFinishFailed}
        autoComplete="off"
      >
        <Form.Item
          name="dateRange"
          getValueProps={value => ({ value: dates || value })}
          getValueFromEvent={(_, value) => {
            setDates(value);
            return value;
          }}
        >
          <RangePicker
            disabledDate={disabledDate}
            onOpenChange={onOpenChange}
          />
        </Form.Item>

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

这样一来,Form.Item 能够正确地获取和设置 RangePicker 的值,同时你的代码中的功能也得以保留。

推荐问题
logo
Microsoft
子站问答
访问
宣传栏