编辑:更好的解释
背景:
我从第三方服务器收到一些纯HTML代码,我想要:
- 将其插入到我的React应用中
- 修改它
使用原生JS的方法
- 我可以使用正则表达式修改字符串,并添加任何具有
id
的HTML标签 - 然后,我可以像平常一样通过
getElementById
修改这些元素
使用React的方法
- 我不应该使用DOM
- 我应该在字符串中插入一些具有React引用的组件
- 相反(将一些React组件插入为纯HTML),可以使用
ReactDOMServer.renderToString
- 因此,当我使用
ReactDOM.render()
注入组件时,问题在于render
方法需要时间,因此如果在下一行尝试使用已插入组件中存在的引用,则其还不存在
问题
- 如何做到这一点?通常,我会将代码放在
useEffect
中,具有[]
依赖项,但是在这里,当应用程序已经挂载时,我正在rendering
组件 - 一个快速的解决方法是只需异步等待500毫秒,然后我就可以访问
ref
,但肯定有更好的方法
此代码失败,因为当ref
被渲染时,它仍不可用,因此ref.current
为undefined
如何等待ref
?
编辑:我提供了使用直接DOM工作的代码,但我认为应避免使用
import React, { useRef, useEffect } from "react";
import ReactDOM from "react-dom";
export default function App() {
const myref = useRef();
useEffect(() => {
const Com = () => <div ref={myref}>hello</div>;
ReactDOM.render(<Com />, document.getElementById("container"));
console.log(myref.current); // undefined
document.getElementById('container').textContent = "direct DOM works"
// the next line fails since the ref is not yet available
// myref.current.textContent = "but this REF is not available"; // fails
}, []);
const plainhtml = '<div><div id="container"></div><div>some more content</div><div id="another">even more content</div></div>'; // this is some large HTML fetched from an external server
return (
<div>
<h1>Hello CodeSandbox</h1>
<div dangerouslySetInnerHTML={{ __html: plainhtml }} />
</div>
);
}
useEffect
内部调用ReactDOM.render
?你应该将其作为子组件渲染,这样就可以使用状态来设置文本内容了。 - alistairtextContent
吗? - Dennis Vashplainhtml
可用(从外部服务器获取)时,useEffect将被调用,但代码示例不需要包括此内容。 - GWorking.render()
,但是当我想要使用refs时,它们不可用(如果我等待几毫秒,它们就会变得可用)。所以问题是如何访问它们(这就是代码示例展示的内容)。 - GWorking