reactjs React钩形式:如何在React Hook窗体版本7.0上使用onChange

4c8rllxm  于 2023-01-08  发布在  React
关注(0)|答案(7)|浏览(130)

以前我常常这样写:

<input className="form-control" name="productImage" type='file' onChange={handleImageUpload} ref={register({ required: true })} />

更新后我不得不这样写:

<input className="form-control" type="file" {...register('productImage', { required: true })} />

如何在React Hook Form的更新版本上使用onChange={handleImageUpload}?以下是docs迁移
请原谅我在提问方式上的错误。我对这些事情还不熟悉。谢谢。

ghhaqwfi

ghhaqwfi1#

https://github.com/react-hook-form/react-hook-form/releases/tag/v7.16.0
V7.16.0为自定义onChange引入了这个新的API。

<input
  type="text"
  {...register('test', {
    onChange: (e) => {},
    onBlur: (e) => {},
  })}
/>
nx7onnlm

nx7onnlm2#

你只需要把onChange的 prop 移到{...register(...)}后面

const productImageField = register("productImage", { required: true });

return (
    <input
        className="form-control"
        type="file"
        {...productImageField}
        onChange={(e) => {
          productImageField.onChange(e);
          handleImageUpload(e);
     }}
    />
)

**(2021年12月3日)编辑:**自react-hook-form v7.16.0's changes以来,这种方法不再正确,参见@Bill 's answer

vulvrdjw

vulvrdjw3#

register文档https://react-hook-form.com/api/useform/register中,示例位于Custom onChange, onBlur部分:

// onChange got overwrite by register method
<input onChange={handleChange} {...register('test')} />

// register's onChange got overwrite by register method
<input {...register('test')} onChange={handleChange}/>

const firstName = register('firstName', { required: true })
<input 
  onChange={(e) => {
    firstName.onChange(e); // method from hook form register
    handleChange(e); // your method
  }}
  onBlur={firstName.onBlur}
  ref={firstName.ref} 
/>

对于您的情况:

const productImageRegister = register("productImage", {required: true})
<input className="form-control"
       type="file"
       {...productImageRegister }
       onChange={e => {
           productImageRegister.onChange(e);
           handleImageUpload(e);
       }} />
pieyvz9o

pieyvz9o4#

对我来说,装修方案奏效了

const fieldRegister = register("productImage", {required: true})
const origOnChange = fieldRegister.onChange
fieldRegister.onChange = (e) => {
    const res = origOnChange(e)
    const value = e.target.value
    // do something with value
    return res
}

用于字段声明

<input {...fieldRegister}/>
chy5wohz

chy5wohz5#

我也遇到了同样的问题。对我来说,问题是我的onChange在react-hook-form的**{... register}**之上,而把它移到register之下就解决了这个问题!!

eqfvzcg8

eqfvzcg86#

我最近在迁移到V7时遇到了类似的问题。如果它能帮助任何人的话。
处理表单的父组件将register函数传递给 Package 器, Package 器将其再次传递给需要在更改时去抖动的输入。
我调用了寄存器formLibraryRef,以防我以后想使用不同的库,但总的来说,我必须这样做:
const { onChange, ...rest } = formLibraryRef(inputName);
将onChange传递给函数,该函数本身传递给输入的本机onChange事件:

const handleDebouncedChange: (event: React.ChangeEvent<HTMLInputElement>) => void = (
    event: ChangeEvent<HTMLInputElement>,
  ) => {
    onChange(event);
    if (preCallback) {
      preCallback();
    }
    debounceInput(event);
  };

然后将剩余部分传递到输入:

<input
  aria-label={inputName}
  name={inputName}
  data-testid={dataTestId}
  className={`form-control ...${classNames}`}
  id={inputId}
  onChange={handleDebouncedChange}
  onFocus={onFocus}
  placeholder={I18n.t(placeholder)}
  {...rest}
/>

此处文档中的register部分:https://react-hook-form.com/migrate-v6-to-v7/提供了更多关于如何获取onChange的信息,并显示了Missing ref的示例。

e5nqia27

e5nqia277#

您可以使用react-hook-form control

<Controller
  render={({ field }) => <input onChange={event=>{
      handleImageUpload(event);
      field.onChange(event);
    }} />}
  name="image"
  control={control}
/>

相关问题