reactjs React createProtal在站点外调用了一个JSX组件,但未更新DOM

oxosxuxt  于 2023-02-08  发布在  React
关注(0)|答案(1)|浏览(103)

我尝试使用createProtal在react应用中呈现动态生成的react组件。当我从类中调用createProtal时,组件没有呈现。
Handler.ts包含业务逻辑的类

export class Handler {
  private element: HTMLElement | null;

  constructor(selector: string) {
      this.element = document.getElementById(selector);
  }

  attachedEvent() {
      this.element?.addEventListener("mouseenter", () => {
          let cancel = setTimeout(() => {
              if (this.element != null)
                  this.attachUi(this.element)
          }, 1000)

          this.element?.addEventListener('mouseleave', () => {
              clearTimeout(cancel)
          })
      })
  }

  attachUi(domNode: HTMLElement) {
      createPortal(createElement(
          'h1',
          {className: 'greeting'},
          'Hello'
      ), domNode);
  }
}

Main.tsx使用Handler.ts的React组分

const handler = new Handler("test_comp");
export default function Main() {

  useEffect(() => {
      // @ts-ignore
      handler.useAddEventListeners();
  });
  return (
      <>
        <div id="test_comp">
          <p>Detect Mouse</p>
        </div>
      </>
  )
 }

但是,当我用下面的函数替换attachUi函数时,它可以工作

attachUi(domNode: HTMLElement) {
    const root = createRoot(domNode);
    root.render(createElement(
        'h1',
        {className: 'greeting'},
        'Hello'
    ));
  }

我错过了什么?

von4xj4u

von4xj4u1#

React使用一种叫做虚拟DOM的东西。只有包含在那个VDOM中的组件才会显示在屏幕上。一个组件返回React理解并包含到VDOM中的东西。
createPortal(...)返回与<SomeComponent ... />完全相同的值
所以如果你这么做:const something = <SomeComponent />,如果你没有在任何地方使用这个变量,你就不能显示它。createPortal.const something = createPortal(...)也是一样。如果你想显示它,就在任何地方使用这个变量。把它添加到VDOM,让你的一些组件返回它。
你的结构是

App
 -children
   -grand children
 -children2

你的门户在其他地方,没有连接到那个VDOM。如果你想显示,你必须把它包含在那里。
在下一个使用root.render的示例中,您将创建一个新的VDOM,它与主VDOM是分开的,这就是显示它的原因

相关问题