【问题标题】:Can I use useRef to pass a reference to an element to a child?我可以使用 useRef 将对元素的引用传递给孩子吗?
【发布时间】:2020-06-30 09:20:59
【问题描述】:

我称我为查看器对象,它将某些东西安装到 ID 为 tgmlviewer 的元素中。当我只有一个这样的组件时,这很好用。

import React, { useEffect } from "react";
import { Viewer } from "../../tgmlViewer/Viewer";
import { disableTgmlPointerEvents } from "../../../constants";
import { XmlType } from "./XmlView";

type Props = {
  serialized: string;
  xmlType: XmlType;
};

const tgmlViewerId = "tgmlviewer";

export default function TgmlImageViewer(props: Props) {
  const { serialized, xmlType } = props;

  useEffect(() => {
    let viewer: Viewer;
    const viewerElement = document.getElementById(tgmlViewerId);
    if (viewerElement instanceof HTMLDivElement) {
      viewer = new Viewer(viewerElement);
      viewer.load(serialized);
    }
    return () => {
      if (viewer) {
        viewer.reset();
      }
    };
  });

  return (
    <div
      id={tgmlViewerId}
    />
  );
}

现在我想创建多个组件。每个组件都需要将唯一的 id 传递给它的查看器对象。是否可以为此使用useRef

这是我最好的尝试:

import React, { useEffect, useRef, Ref } from "react";
import { Viewer } from "../../tgmlViewer/Viewer";
import { disableTgmlPointerEvents } from "../../../constants";
import { XmlType } from "./XmlView";

type Props = {
  serialized: string;
  xmlType: XmlType;
};

export default function TgmlImageViewer(props: Props) {
  const { serialized, xmlType } = props;

  const tgmlViewerMountingTarget = useRef(null);

  useEffect(() => {
    if (!tgmlViewerMountingTarget) {
      return;
    }
    let viewer: Viewer;
    const viewerElement = tgmlViewerMountingTarget.current;
    if (viewerElement instanceof HTMLDivElement) {
      viewer = new Viewer(viewerElement);
      viewer.load(serialized);
    }
    return () => {
      if (viewer) {
        viewer.reset();
      }
    };
  });

  return (
    <div
      ref={tgmlViewerMountingTarget}
    />
  );
}

TypeScript 错误

ts: const viewerElement: null // 'instanceof' 表达式的左侧必须是 'any' 类型、对象类型或类型参数。

【问题讨论】:

  • ref forwarding 不是您要找的东西吗?
  • 我能够通过将类型传递给 useRef 函数来解决问题。 ref 转发会比 useRef 更好吗?

标签: reactjs typescript use-ref


【解决方案1】:

改变

const tgmlViewerMountingTarget = useRef(null);

const tgmlViewerMountingTarget = useRef<HTMLDivElement>(null);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-07
    • 2021-05-08
    • 2017-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-09
    • 1970-01-01
    相关资源
    最近更新 更多