是否可以将 react-datepicker 与反应钩子形式一起使用?

Posted

技术标签:

【中文标题】是否可以将 react-datepicker 与反应钩子形式一起使用?【英文标题】:Is it possible to use react-datepicker with react hooks forms? 【发布时间】:2020-07-06 22:18:39 【问题描述】:

是否可以将 react-datepicker 与 react hooks 表单一起使用?我尝试了以下示例:

https://codesandbox.io/s/awesome-shape-j0747?fontsize=14&hidenavigation=1&theme=dark

但没有运气。

import React,  useState  from "react";
import "./styles.css";
import  useForm  from "react-hook-form";
import  Row, Col, Form, FormGroup, Label, Input, Button  from "reactstrap";
import DatePicker from "react-datepicker";

export default function App() 
  const  register, handleSubmit  = useForm();
  const [startDate, setStartDate] = useState();
  const [result, setResult] = useState();

  const onSearch = event => 
    setResult(event);
  ;

  return (
    <div className="App">
      <Form onSubmit=handleSubmit(onSearch)>
        <Row>
          <Col>
            <FormGroup>
              <Input
                type="number"
                name="account"
                id="account"
                placeholder="AccountId"
                innerRef=register( required: true, maxLength: 20 )
              />
            </FormGroup>
          </Col>
        </Row>

        <Row>
          <Col>
            <DatePicker
              innerRef=register
              name="datetime"
              className="form-control"
              selected=startDate
              onChange=date => setStartDate(date)
              showTimeSelect
              timeFormat="HH:mm"
              timeIntervals=15
              timeCaption="time"
              dateFormat="MM-dd-yyyy h:mm"
            />
          </Col>
        </Row>

        <Button>Submit</Button>
      </Form>
      <div>JSON.stringify(result)</div>
    </div>
  );

【问题讨论】:

【参考方案1】:

请查看控制器文档:https://react-hook-form.com/api/#Controller

我们正在维护一个代码框示例,用于托管大多数外部组件 UI 库的实现:https://codesandbox.io/s/react-hook-form-controller-079xx

<Controller
  as=ReactDatePicker
  control=control
  valueName="selected" // DateSelect value's name is selected
  onChange=([selected]) => selected
  name="ReactDatepicker"
  className="input"
  placeholderText="Select date"
/>

编辑

使用最新版本的 react-hook-form 这是使用渲染的控制器实现:

            <Controller
                name=name
                control=control
                render=( onChange, value ) => (
                    <DatePicker
                        selected=value
                        onChange=onChange
                    />
                )
            />

【讨论】:

@AstritSpanca:请注意,这种方法不适用于 Material UI Pickers。您需要使用controlled component。 我们如何实现具有多个表单输入的日期字段。 如何使用 Controller(DatePicker) 实现“yup”所需的验证?未选择日期时,我需要显示必填字段消息。【参考方案2】:

使用 react-hooks-form v7

导入依赖:

import  Controller, useForm  from 'react-hook-form'
import DatePicker from 'react-datepicker'

将控件添加到 useForm() 挂钩:

const  control, register, handleSubmit, ...  = useForm()

添加Controller和DatePicker组件:

 <Controller
    control=control
    name='date-input'
    render=( field ) => (
      <DatePicker
        placeholderText='Select date'
        onChange=(date) => field.onChange(date)
        selected=field.value
      />
   )
  />

【讨论】:

【参考方案3】:

使用 react Material-UI

首先请注意您已使用 LocalizationProvider 包装了您的 App 组件。就我而言,它是时刻库。 https://mui.com/components/date-picker/

这里是可重用的 DatePickerAsController 组件:)

import React from 'react';
import  Controller  from 'react-hook-form';
import  TextField, TextFieldProps  from '@mui/material';
import clsx from 'clsx';
import  DatePicker  from '@mui/lab';
import  Moment  from 'moment';
    
export interface DatePickerAsControllerProps 
  control: any;
  name: string;
  value: Moment;
  rules?: any;
  classes?: string[];
  label: string;
  onChange: (date: Moment) => void;


export function DatePickerAsController(props: DatePickerAsControllerProps) 
  const  control, name, rules, classes, label, onChange, value  =
    props;

  const handleChange = (date: Moment, field: any) => 
    console.log(date);
    field.onChange(date);
    onChange(date);
  ;

  return (
    <Controller
      control=control
      name=name
      rules=rules
      render=( field ) => (
        <DatePicker
          label=label
          value=value
          onChange=(date: Moment) => handleChange(date, field)
          renderInput=(params: TextFieldProps) => (
            <TextField className=clsx(classes) ...params />
          )
        />
      )
    />
  );

【讨论】:

以上是关于是否可以将 react-datepicker 与反应钩子形式一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

将样式/类添加到 react-datepicker

如何在 react-datepicker 中自定义样式?

如何使 react-datepicker 正确显示?

如何在 react-datepicker 中选择默认日期范围

如何使用 Formik 在 react-datepicker 中设置初始日期?

抛出错误 RangeError:将自定义日期设置为 react-datepicker 的 DatePicker 时时间值无效