javascript react-hook-form的钩子调用无效

gcxthw6b  于 2023-04-04  发布在  Java
关注(0)|答案(1)|浏览(146)

我刚接触react hook form,所以这可能是一个简单的问题。我刚刚发现Controllers不能使用value作为数字。这让我很恼火,但我最终发现了这个github问题#8068,它描述了解决方案,设置一个onChange函数如下:

<Controller
-    rules={{ valueAsNumber: true }}
      render={({ field }) => (
          <input
-             onChange={field.onChange}
+             onChange={(event) => field.onChange(+event.target.value)}
              type="number"
          />
  )}
/>

所以我做了些小改动,得到了这个代码

import React, { ChangeEvent } from 'react'
import { Controller } from 'react-hook-form'
import { getPlaceholder } from './getPlaceholder'
import { IInput } from './types'

const NumberInput: React.FC<IInput> = ({ control, name, ...props }) => {
  const placeholder = getPlaceholder({ type: "number" });
  const numericalOnChange = (event: ChangeEvent<HTMLInputElement>) => {
    if (event.target.value === '') return null;
    return +event.target.value;
  }

  return (
    <Controller
      control={control}
      name={name}
      render={({ field: { onChange, ...field } }) => (
        <input
          {...props}
          {...field}
          type="number"
          placeholder={placeholder}
          onChange={(event) => {
            const value = numericalOnChange(event)
            onChange(value)
          }}
          className="h-[20px] pl-[4px] py-[8px] bg-transparent border-b
          border-b-[#646464] focus:border-b-[#3898EC] text-[13px]
          text-[#F00] placeholder-[#646464] outline-none m-1 w-full"
        />
      )}
    />
  )
}

export default NumberInput

这在理论上应该工作,但最终提供了一个无效的钩子调用错误。

toe95027

toe950271#

单独定义一个NumberInput组件,然后直接在表单中将其 Package 在Controller中:

// NumberInput.js
export const NumberInput = ({ value, onChange, ...rest }) => {
  const handleChange = (e) => {
    onChange(Number(e.target.value));
  };
 
  return (
    <input
      type="number"
      min={0}
      onChange={handleChange}
      value={value}
      {...rest}
    />
  );
};

然后在调用useForm的组件中:

<Controller
  name='number'
  control={control}
  render={({ field: { ref, ...field } }) => (
    <NumberInput {...field} type="number" />
  )}
/>

你可以在这篇文章中找到更多信息。

相关问题