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

Fam*_*8er 10 typescript reactjs tsx

我正在尝试useRef与 TypeScript一起使用,但遇到了一些麻烦。

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

我已经尝试了以下

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

但是当我去设置时,ref我总是被告知 Xis 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>
}
Run Code Online (Sandbox Code Playgroud)

She*_*ith 210

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

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

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

const ref = useRef<HTMLDivElement>(null);

return <div ref={ref}> Some Content... </div>
Run Code Online (Sandbox Code Playgroud)


cap*_*ian 6

只需导入 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>
}
Run Code Online (Sandbox Code Playgroud)

我做了一个更新。使用HTMLDivElement作为泛型参数代替HTMLElement | null。此外,contains期待一个论点。

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

看下一个类型:

interface RefObject<T> {
  readonly current: T | null
}
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢你,这确实有效。如果可以的话,请提供有关*为什么*这有效以及为什么应该使用此界面的更多详细信息。谢谢 (2认同)
  • 感谢您的更新,我会接受这个答案。我想我理解关于“null”的部分,我更感兴趣的是为什么“HTMLDivElement”能够处理“ref”,但“HTMLElement”却不能 (2认同)
  • HTMLElement 接口是所有 html 元素的父接口。它不起作用,因为您无法按字面意思创建 HTMLElement。您只能创建 HTMLDivElement、HTMLSpanElement、HTMLAnchorElement 等...。所以 React/JSX 只能接受 HTML{element}Element。例如,它抱怨 HTMLElement 没有“align”属性。将鼠标悬停在 IDE 中的 ref 属性上,按住 Ctrl 键并单击 ref 属性。它应该将您重定向到引用类型 (2认同)

Bra*_*ing 5

我来这里寻求 iframe 参考的帮助。也许这个解决方案会帮助其他正在寻找同样东西的人。我HTMLDivElementHTMLIFrameElement这样替换:

const node = useRef<HTMLIFrameElement>(null);
Run Code Online (Sandbox Code Playgroud)

  • 我只需添加默认的“null”值。立即纠正我的错误 (2认同)

小智 5

同样代表<svg>元素:

const ref = useRef<SVGSVGElement>(null)
...
<svg ref={ref} />
Run Code Online (Sandbox Code Playgroud)