能否在React Hooks表单中使用react-datepicker?

49
能否在react hooks表单中使用react-datepicker?我尝试了以下示例: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>
  );
}
3个回答

49

使用 react-hooks-form v7

导入依赖:

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

为useForm() hook添加控制:


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}
      />
   )}
  />

2
你甚至可以写成 onChange={onChange} ^^ - Moebius
谢谢!那节省了我很多时间! - Stefan Rows
1
如果您在显示日历方面遇到问题,可以添加以下代码: import "react-datepicker/dist/react-datepicker.css"; - Nandoviski

47
请查看 Controller 文档:https://react-hook-form.com/api/#Controller,我们维护了一个 codesandbox 示例来托管大多数外部组件 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,这是使用渲染(render)的Controller实现:

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

1
@AstritSpanca:请注意,这种方法对于Material UI Pickers不起作用。您需要使用受控组件 - Dan Dascalescu
我们如何使用多个表单输入实现日期字段? - Vikas Ukani
如何在控制器(DatePicker)中使用"yup"实现必填验证? 当未选择日期时,我需要显示必填字段消息。 - Mehul Mali
1
@Bill,我们可以使用“register”来实现这个吗? - Zeeshan Ahmad Khalil
如果您遇到显示日历的问题,您可以添加以下代码: import "react-datepicker/dist/react-datepicker.css"; - Nandoviski
如果你在显示日历方面遇到问题,可以添加以下代码: import "react-datepicker/dist/react-datepicker.css"; - undefined

-1

我使用 react-hook-form 7.43.9 和 @mui/x-date-pickers 6.3.1 进行编程。我为我的表单创建了自定义的 DateInput 组件。

import * as React from "react";

import {
    useController,
    useFormContext
} from "react-hook-form";

import { DatePicker } from "@mui/x-date-pickers";

interface IProps {
    label: string;
    name: string;
}

export const DateInput = ({ label, name }: IProps) => {
    const { control } = useFormContext();
    const { field } = useController({ control, name, defaultValue: null });
            
    return <DatePicker
        label={label}
        maxDate={new Date()}
        value={field.value}
        onChange={field.onChange}
        slotProps={{
            textField: {
                ...{ readOnly: true }
            }
        }}
    />;
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接