You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在React Hook Form+shadcn/ui中避免重复传递control参数?

解决方案:利用React Hook Form上下文传递form实例

要解决ItemInput无法访问form.control且不想重复传递参数的问题,你可以借助React Hook Form的useFormContext钩子,结合shadcn/ui的Form组件内置的上下文能力实现:

修改ItemInput.tsx组件

在组件中导入useFormContext,从上下文中获取form实例,无需手动传入control:

import { useFormContext } from "react-hook-form"; // 新增导入
import { FormControl, FormField, FormItem, FormMessage } from "./ui/form"
import { Input } from "./ui/input"

type InputProps = {
    name: string
    placeholder: string
}

const ItemInput = ({name, placeholder}: InputProps) => {
  const { control } = useFormContext(); // 从上下文获取control

  return (
    <div>
         <FormField
            control={control} // 使用上下文获取的control
            name={name}
            render={({ field }) => (
              <FormItem>
                <FormControl>
                  <Input placeholder={placeholder} {...field} />
                </FormControl>
                <FormMessage />
              </FormItem>
            )}
          />
    </div>
  )
}

export default ItemInput

确认PracticeForm的结构

你的PracticeForm中已经正确使用了shadcn/ui的<Form {...form}>组件,这个组件内部会通过FormProvider将form实例注入到上下文,确保ItemInput作为它的子组件(或后代组件)就能正常获取到上下文。

原理说明

shadcn/ui的<Form>组件封装了React Hook Form的FormProvider,会将form实例传递给所有后代组件。通过useFormContext钩子,子组件可以直接从上下文中取出form的control等属性,避免了重复传递props的麻烦。

内容的提问来源于stack exchange,提问作者Paulprg19

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 02:20:56