React - useRef 与 TypeScript 和功能组件

Posted

技术标签:

【中文标题】React - useRef 与 TypeScript 和功能组件【英文标题】:React - useRef with TypeScript and functional component 【发布时间】:2020-06-18 15:25:29 【问题描述】:

我试图从父组件调用子组件方法,并且试图使用 useRef。未来,SayHi 方法将在子组件中更新钩子状态。不幸的是,我有一些我无法处理的错误。

行:ref.current.SayHi();

'ForwardRefExoticComponent void; >>'。

行:

类型'RefObject void; >>>' 不能分配给类型 '((instance: SayHi: () => void; | null) => void) | RefObject void; > |空 |不明确的'。 类型 'RefObject 无效; >>>' 不能分配给类型 'RefObject void; >'。 'ForwardRefExoticComponent void; >>' 但在 ' SayHi: () => void; 类型中是必需的'。

完整的 test.tsx 文件:

import React,  useRef, forwardRef, useImperativeHandle, Ref  from 'react'

const Parent = () => 
    const ref = useRef<typeof Child>(null);
    const onButtonClick = () => 
      if (ref.current) 
        ref.current.SayHi();
      
    ;
    return (
      <div>
        <Child name="Adam" ref=ref/>
        <button onClick=onButtonClick>Log console</button>
      </div>
    );
  

const Child = forwardRef((props: name: string, ref: Ref<SayHi: () => void>)=> 
  const name = props;
  useImperativeHandle(ref, () => ( SayHi ));

  function SayHi()  console.log("Hello " + name); 

  return <div>name</div>;
);

我在这个话题上深深地寻求帮助。

【问题讨论】:

【参考方案1】:

您需要在别处提取 ref 类型:

interface RefObject 
  SayHi: () => void

然后在两个地方都引用它

const Child = forwardRef((props: name: string, ref: Ref<RefObject>)=> 
  const name = props;  
  useImperativeHandle(ref, () => ( SayHi ));
  function SayHi()  console.log("Hello " + name); 

  return <div>name</div>;
);
const Parent = () => 
    const ref = useRef<RefObject>(null);
    const onButtonClick = () => 
      if (ref.current) 
        ref.current.SayHi();
      
    ;
    return (
      <div>
        <Child name="Adam" ref=ref/>
        <button onClick=onButtonClick>Log console</button>
      </div>
    );

【讨论】:

非常感谢! :)【参考方案2】:

只需将 ref 的声明替换为 const ref = useRef&lt; SayHi: () =&gt; void &gt;(null);

【讨论】:

以上是关于React - useRef 与 TypeScript 和功能组件的主要内容,如果未能解决你的问题,请参考以下文章

将 gsap ScrollTrigger 与 React useRef() 和 Typescript 一起使用 - 类型不匹配

重载与 useRef 不匹配

React - UseState,UseRef..In Trouble

[react] 请说说什么是useRef?

react useRef()函数

useRef 是不是在 React 中存储变量的地址