首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在React 18中用JSX替换DOM

在React 18中用JSX替换DOM
EN

Stack Overflow用户
提问于 2022-08-27 06:59:50
回答 2查看 130关注 0票数 1

如何从我的控制台删除此错误消息

我使用ReactDOM.render将我的代码中的某些“不可访问”的部分替换为JSX组件,它在以前的版本中运行得很好,但是现在我收到了这条恼人的错误消息,我想摆脱它。

说来话长:

我正在为react18和Nextjs使用react18库。

我面临着库的限制,在以前的版本中,我能够通过JSX在头按钮中呈现,但在当前版本的5.11.2中,它已经不可能了,它是只允许您设置文本或引导/字体-可怕的图标。

因此,我使用了一个已知的老技巧,用HTML元素代替DOM

代码语言:javascript
复制
ReactDOM.render(
  <AnyIconIWantToUse />,
  window.document.querySelector("#element-to-replace-id")
)

这就是导致上述错误消息的原因。

我试过的

正如错误提示的那样,我尝试过使用createRoot,但是它也给了我一个错误(而且afaik只用于根组件,所以我不喜欢使用它)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-08-27 23:24:21

最后,我用另一种方法实现了我想要的。

与直接用JSX替换DOM内容相反,我将所需的JSX呈现到DOM中,并将DOM替换为DOM

代码语言:javascript
复制
// utils/replaceDOM.ts
import type React from 'react';
import { renderToString } from 'react-dom/server';

type ReplaceDOM = (
  elementToReplace: Element,
  replacement: React.ReactElement
) => void;

const replaceDOM: ReplaceDOM = (elementToReplace, replacement) => {
  if (!replacement) return;
  // Get html from component (only get first render)
  const replacementHTML = renderToString(replacement);
  // Parse html string into html
  const parser = new DOMParser();
  const parsedDocument = parser.parseFromString(replacementHTML, 'text/html');
  const replacementElement = parsedDocument.body.children[0];
  // Append replacement to DOM
  window.document.body.prepend(replacementElement);
  // Replace children with element
  elementToReplace.replaceWith(replacementElement);
};

export default replaceDOM;

然后我就可以按需要使用它了

代码语言:javascript
复制
replaceDOM(elementToReplace, <ElementIWant className="w-6" />);
票数 0
EN

Stack Overflow用户

发布于 2022-08-27 07:41:08

这应该能帮到你

代码语言:javascript
复制
createPortal(
    <AnyIconIWantToUse />,
    document.getElementById("element-to-replace-id")
 )
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73508988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档