reactjs - react-hook-form reset 不适用于 Controller + antd

标签 reactjs antd react-hook-form

我正在尝试将 react-hook-form 与 antd <Input /> 一起使用成分

我没有收到 reset<Controller /> 一起工作

这是我的代码:

const  NormalLoginForm = () =>{
  const {reset, handleSubmit, control} = useForm();

  const onSubmit = handleSubmit(async ({username, password}) => {
        console.log(username, password);
        reset();
  });

    return (
      <form onSubmit={onSubmit} className="login-form">
        <Form.Item>
                        <Controller as={<Input
                            prefix={<Icon type="user" style={{color: 'rgba(0,0,0,.25)'}}/>}
                            autoFocus={true}
                            placeholder="Benutzername"

                        />} name={'username'} control={control}/>

                    </Form.Item>
                    <Form.Item>
                        <Controller as={<Input
                            prefix={<Icon type="lock" style={{color: 'rgba(0,0,0,.25)'}}/>}
                            type="password"
                            placeholder="Passwort"

                        />} name={'password'} control={control}/>
                    </Form.Item>
        <Form.Item>
          <Button type="primary" htmlType="submit" className="login-form-button">
            Log in
          </Button>
        </Form.Item>
      </form>
    );
}

我期望在提交表单时清除两个输入字段。但这不起作用。

我在这里错过了什么吗?

Stackblitz 上的示例
https://stackblitz.com/edit/react-y94jpf?file=index.js

编辑:
RHFInput这里提到React Hook Form with AntD Styling现在是 react-hook-form 的一部分,并已重命名为 Controller .我已经在用了。

我已经发现改变
reset();


reset({
  username:'',
  password:''
});

解决了这个问题。

但是 - 我想在不明确分配新值的情况下重置整个表单。

编辑 2:

Bill 在评论中指出,几乎不可能检测到外部控制输入的默认值。因此,我们被迫将默认值传递给 reset 方法。这对我来说完全有意义。

最佳答案

您必须为 antd 包装组件并创建一个渲染组件,如果您使用 Material UI 则非常相似,因此代码可以是这样的:

import { Input, Button } from 'antd';
import React from 'react';
import 'antd/dist/antd.css';
import {useForm, Controller} from 'react-hook-form';

const RenderInput = ({
  field: {
    onChange,
    value
  },
  prefix,
  autoFocus,
  placeholder
}) => {

  return (
    <Input
      prefix={prefix}
      autoFocus={autoFocus}
      placeholder={placeholder}
      onChange={onChange}
      value={value}
    />
  );
}

export const  NormalLoginForm = () =>{
  const {reset, handleSubmit, control} = useForm();

  const onSubmit = ({username, password}) => {
        console.log(username, password);
        reset();
  };

  return (
    <form onSubmit={handleSubmit(onSubmit)} className="login-form">
      <Controller
        control={control}
        name={'username'}
        defaultValue=""
        render={ ({field}) => (
          <RenderInput
            field={field}
            autoFocus={true}
            placeholder="Benutzername"
          />
          )}
      />
      <Controller
        render={ ({field}) => (
          <RenderInput
            field={field}
            type="password"
            placeholder="Passwort"
          />
          )}
        defaultValue=""      
        name={'password'}
        control={control}
      />
      <Button
        type="primary"
        htmlType="submit"
        className="login-form-button"
      >
        Log in
      </Button>
    </form>
  );
}

export default NormalLoginForm;
您可以注意到我没有放置 Icon ,这是因为我使用 antd 版本 4 进行了测试,并且在如何使用图标方面发生了一些变化。

关于reactjs - react-hook-form reset 不适用于 Controller + antd,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59875287/

相关文章:

reactjs - 如何将菜单项在导航栏中居中,如示例

javascript - 如何替换 REACT.js 中的 refs(antd 表示例)

reactjs - React Hook 形式 - 填充选择多个选项数组

javascript - 延迟父组件渲染,直到所有子组件渲染 reactjs

javascript - 在 ReactJS 中使用 useState 时 [...arr, addThisElement] 和 arr.push(addThisElement) 有什么区别?

angular - 调整Nz-Table动态列中某些列的宽度

javascript - 来自react-form-hook的自定义输入不起作用

reactjs - React hook Form 知道何时修改值

javascript - ReactJs - 如何在一个组件内传递数据

javascript - Radium for React.js 内联样式意外 token 错误?