Mat*_*sen 6 typescript reactjs tsx
我试图让我的组件接受一个引用。
我有一个像这样的组件:
const MyComponent: RefForwardingComponent<HTMLDivElement, IMyComponentProps> = (props, ref) => {
return <div ref={ref}>Hoopla</div>
}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试将 ref 传递给时是这样的:
<MyComponent ref={myRef}></MyComponent>
Run Code Online (Sandbox Code Playgroud)
...我收到此错误:
Property 'ref' does not exist on type 'IntrinsicAttributes & IMyComponentProps & { children?: ReactNode; }'.ts(2322)
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
for*_*d04 13
RefForwardingComponent是一个渲染函数,它接收 props 和 ref 参数并返回一个 React 节点 - 它不是组件:
第二个 ref 参数仅在您使用 React.forwardRef 调用定义组件时才存在。常规函数或类组件不接收 ref 参数,并且 ref 在 props 中也不可用。(文档)
这也是原因,为什么RefForwardingComponent被弃用的青睐ForwardRefRenderFunction,这是功能上等同,但有一个不同的名称,使区分更加清晰。
您用于React.forwardRef将渲染函数转换为接受 refs 的实际组件:
import React, { ForwardRefRenderFunction } from 'react'
type IMyComponentProps = { a: string }
const MyComponentRenderFn: ForwardRefRenderFunction<HTMLDivElement, IMyComponentProps> =
(props, ref) => <div ref={ref}>Hoopla</div>
const MyComponent = React.forwardRef(MyComponentRenderFn);
const myRef = React.createRef<HTMLDivElement>();
<MyComponent a="foo" ref={myRef} />
Run Code Online (Sandbox Code Playgroud)
小智 6
您的代码是正确的,但您缺少一个小细节。
使用时RefForwardingComponent需要导出包裹的组件forwardRef
import React, { forwardRef, RefForwardingComponent } from 'react';
type IMyComponentProps = {}
const MyComponent: RefForwardingComponent<HTMLDivElement, IMyComponentProps> = (props, ref) => {
return <div ref={ref}>Hoopla</div>
}
export default forwardRef(MyComponent);
Run Code Online (Sandbox Code Playgroud)
小智 -1
自定义函数组件不能将“ref”作为 prop。您必须给它一个不同的名称。例如,“yourRef”将位于 props 对象内。
<MyComponent yourRef={myRef}></MyComponent>
Run Code Online (Sandbox Code Playgroud)
所以要使用 ref 属性:
const MyComponent: RefForwardingComponent<HTMLDivElement, IMyComponentProps> = (props) => {
return <div ref={props.yourRef}>Hoopla</div>}
Run Code Online (Sandbox Code Playgroud)
或者你可以解构道具:
const MyComponent: RefForwardingComponent<HTMLDivElement, IMyComponentProps> = ({yourRef}) => {
return <div ref={yourRef}>Hoopla</div>}
Run Code Online (Sandbox Code Playgroud)