useRef TypeScript - 不可分配给类型 LegacyRef<HTMLDivElement>

新手上路,请多包涵

我正在尝试将 useRef 与 TypeScript 一起使用,但遇到了一些问题。

使用我的 RefObject (我假设)我需要访问 current 。 (即 node.current

我试过以下

  • const node: RefObject<HTMLElement> = useRef(null);
  • const node = useRef<HTMLElement | null>(null);

但是当我去设置 ref 我总是被告知 X is not assignable to type 'LegacyRef<HTMLDivElement> | undefined'.

return <div ref={ node }>{ children }</div>

编辑:这不应该限于任何一种类型的元素,所以不仅仅是 HTMLDivElement | HTMLFormElement | HTMLInputElement

编辑:这应该作为一个例子

import React, { useRef, RefObject } from 'react';

function Test()
{
    // const node = useRef(null);
    // const node: RefObject<HTMLElement> = useRef(null);
    const node = useRef<HTMLElement | null>(null);

    if (
        node &&
        node.current &&
        node.current.contains()
    ){ console.log("current accessed")}

    return <div ref={ node }></div>
}

原文由 FamousAv8er 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.6k
2 个回答

只需导入 React:

 import React, { useRef } from 'react';

function Test() {
    const node = useRef<HTMLDivElement>(null);

    if (
        node &&
        node.current &&
        node.current.contains()
    ){ console.log("current accessed")}

    return <div ref={node}></div>
}

我做了一个更新。使用 HTMLDivElement 作为通用参数,而不是 HTMLElement | null 。此外, contains 需要一个参数。

更新 useRef 需要 DOM 元素类型的通用参数。您不需要使用 | null 因为 RefObject 已经知道 current 可能为空。

看下一个类型:

 interface RefObject<T> {
  readonly current: T | null
}

TS 和 React 足够聪明,可以确定您的 ref 可能为空

原文由 captain-yossarian from Ukraine 发布,翻译遵循 CC BY-SA 4.0 许可协议

以上都不适合我,但事实证明解决方案非常简单……

我做错的只是没有明确地将“null”作为 useRef 初始化中的参数(它需要 null,而不是 undefined)。你也不能使用“HTMLElement”作为你的引用类型,你必须更具体,所以对我来说它是“HTMLDivElement”例如)。

所以对我来说工作代码是这样的:

 const ref = useRef<HTMLDivElement>(null);

return <div ref={ref}> Some Content... </div>

原文由 Sheldonfrith 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进