javascript 如何在现有的React树中正确使用hydrate(和/或hydrateRoot)?

i7uaboj4  于 2023-03-21  发布在  Java
关注(0)|答案(1)|浏览(138)

这是正确的代码,正确地水合代码,例如在一个使用效果?

import React, { useEffect, useRef } from 'react'
import { hydrate, unmountComponentAtNode } from 'react-dom'

export default function ({ html }: { html: string }) {
  const ref = useRef<HTMLDivElement>(null)

  useEffect(() => {
    const domNode = ref.current
    if (domNode) {
      if (domNode.innerHTML) {
        unmountComponentAtNode(domNode)
      }

      domNode.innerHTML = html
      hydrate(<MyComponent />, domNode)
    }
    return () => {
      if (domNode) {
        unmountComponentAtNode(domNode)
      }
    }
  }, [html])

  return <div ref={ref} />
}

我知道这是一个奇怪的模式,但基本上我们是从一个网络工作者执行“SSR”,这是这个奇怪的方法的背景
然而,这产生了许多奇怪的错误,包括

Warning: render(...): It looks like the React-rendered content of this container was removed without using React. This is not supported and will cause errors. Instead, call ReactDOM.unmountComponentAtNode to empty a container.

我还看到其他罕见的错误,如

Node.removeChild: The node to be removed is not a child of this node

以及

Warning: unmountComponentAtNode(): The node you're attempting to unmount was rendered by another copy of React.
kkbh8khc

kkbh8khc1#

我发现了一个解决方案,它现在不会产生任何警告,但它也完全删除了unmountComponentAtNode代码。
我不确定这是否会导致内存泄漏。我的想法是,由于我正在水合的<div/>是“由更高的React树管理的”,因此我不必手动调用任何卸载。
如果任何ReactMaven想要评论或添加其他答案,请随时联系

import React, { useEffect, useRef } from 'react'
import { hydrate } from 'react-dom'

export default function ({ html }: { html: string }) {
  const ref = useRef<HTMLDivElement>(null)

  useEffect(() => {
    const domNode = ref.current
    if (!domNode) {
      return
    }

    hydrate(<MyComponent/>, domNode)
  }, [])

  return <div ref={ref} dangerouslySetInnerHTML={{ __html: html }} />
}

相关问题