我有以下自定义输入组件:
export type InputProps = {
error?: string
} & InputHTMLAttributes<HTMLInputElement>
export const Input: FunctionComponent<InputProps> = ({ error, ...props }) => (
<input {...props} />
)用法
<form onSubmit={handleSubmit(onSubmit)}>
<Input placeholder="https://example.com" error={errors.url?.message} {...register('url')} />
<input type="submit" />
</form>当我尝试使用它时,我会收到一个验证错误,因为URL是空的(空字符串),我试着调试,函数寄存器只返回{name: "url"},这在我看来是可疑的。
我做错了什么?
编辑
我在控制台上看到这个
Warning: Function components cannot be given refs. Attempts to access this ref will fail. Did you mean to use React.forwardRef()?
Check the render method of `Home`.
at Input (webpack-internal:///./components/input.tsx:10:11)
at form
at div
at div
at Home (webpack-internal:///./pages/index.tsx:17:90)
at App (webpack-internal:///./pages/_app.tsx:11:11)
at Hydrate (webpack-internal:///./node_modules/@tanstack/react-query/build/lib/Hydrate.mjs:30:3)
at QueryClientProvider (webpack-internal:///./node_modules/@tanstack/react-query/build/lib/QueryClientProvider.mjs:47:3)
at TRPCProvider (webpack-internal:///./node_modules/@trpc/react-query/dist/createHooksInternal-2bef4843.mjs:158:17)
at WithTRPC (webpack-internal:///./node_modules/@trpc/next/dist/index.mjs:44:83)
at PathnameContextProviderAdapter (webpack-internal:///./node_modules/next/dist/shared/lib/router/adapters.js:62:11)
at ErrorBoundary (webpack-internal:///./node_modules/next/dist/compiled/@next/react-dev-overlay/dist/client.js:2:3325)
at ReactDevOverlay (webpack-internal:///./node_modules/next/dist/compiled/@next/react-dev-overlay/dist/client.js:2:6707)
at Container (webpack-internal:///./node_modules/next/dist/client/index.js:60:1)
at AppContainer (webpack-internal:///./node_modules/next/dist/client/index.js:173:11)
at Root (webpack-internal:///./node_modules/next/dist/client/index.js:346:11)发布于 2022-11-27 21:32:43
该错误告诉您正在尝试通过使用useRef来引用功能组件本身。
为了给功能组件提供参考,它应该通过forwardRef来实现。
除了无法看到在您的端端作为代码实现了什么之外,错误还告诉您要查看‘Home’组件的呈现函数,因为您使用了对您在下共享的输入组件的引用。
如果您提供的话,我可以添加如何包装您的组件或对沙箱进行编辑,但是,更有可能的是,您可能会出现错误,没有遵循命名约定来作出反应。如在反应文件中所述;
始终以大写字母开头组件名称。
**这意味着按照组件名称输入,您应该将文件命名为Input.tsx
https://stackoverflow.com/questions/74577022
复制相似问题