从 React 中的 document.createElementNS 创建的 Material UI 图标未正确加载

Posted

技术标签:

【中文标题】从 React 中的 document.createElementNS 创建的 Material UI 图标未正确加载【英文标题】:Material UI Icon created from document.createElementNS in React is not loading correctly 【发布时间】:2021-02-10 09:56:02 【问题描述】:

我正在我的应用程序中创建一个标签部分,类似于新 Stack Overflow 问题表单中的标签部分。我正在使用 youtube tutorial 中所示的 Material UI 关闭图标(我知道我正确安装了 Material UI 图标,因为我创建的演示图标有效,只是我使用 document.createElementNS 动态创建的图标不起作用 - 并且视频教程仅适用于没有 React 实现的 vanilla javascript 教程。我目前正在转换为 React 过程)

我尝试在 Stack Overflow 上使用此答案强制更新/渲染 React 应用程序 - React - How to force a function component to render? - 但这仍然不能使 Material UI 图标加载到正确的 SVG 表单中。

我的代码如下所示:(我使用 createElementNS 而不是 createElement,因为我认为我需要使用正确的大写 html 标记才能使 Material UI 图标工作 - 即。->)

  const formTagContainer = useRef(null);

  function createTag(label) 
    const div = document.createElement("div");
    const closeBtn = document.createElementNS("", `CloseIcon`);
    div.appendChild(closeBtn);
    return div;
  

  useEffect(() => 
    formTagContainer.current.appendChild(createTag("Jumbotron"));
  , []);

  return (
    <>
      <div ref=formTagContainer className="tagContainer" />
    </>
  );

上面的代码只是生成'&lt;div&gt;&lt;CloseIcon&gt;&lt;/CloseIcon&gt;&lt;/div&gt;',而没有将&lt;CloseIcon&gt;&lt;/CloseIcon&gt;部分切换为关闭图标按钮的SVG形式。当我在 JSX 中正常使用 CloseIcon 按钮时,它工作正常。所以我同时渲染了一个工作版本和一个非工作版本。强制重新渲染应用程序似乎不会使图标变成 SVG 格式。如何在 React 中动态加载图标?

【问题讨论】:

【参考方案1】:

在使用 react 时不应该手动操作 dom,而是将标签存储在一个 state 中,然后在 JSX 中的 div 中渲染它们

  const [tags, setTags] = useState([]);

  useEffect(() => 
    setTags([...tags, label: 'Jumbotron'])
  , []);

  return (
    <>
      <div className="tagContainer">
        tags.map(tag => <div>tag.label<CloseIcon /></div>)
      </div>
    </>
  );

如果你需要一个默认标签,只需将它的标签状态初始值,然后你可以删除不必要的useEffect

const [tags, setTags] = useState([label: 'Jumbotron']);

【讨论】:

非常感谢您的回答!!这完全解决了我的问题!现在我有一个可以运行的应用程序:D 我想知道如何绕过在 React 中创建 dom 元素,但想不出那个解决方案,非常感谢!

以上是关于从 React 中的 document.createElementNS 创建的 Material UI 图标未正确加载的主要内容,如果未能解决你的问题,请参考以下文章

如何从 React 中的方法返回 JSX?

如何从 React 中的外部模块正确加载 CSS?

无法从 Express 中捕获 React 中的错误

如何从 React 中的公共文件夹设置背景图像(创建 React 应用程序)

如何从 React 中的 JSON 文件导入数据?

如何从 react.js 中的表单收集值?