[英]Add/inject React component into pure HTML that came from the back-end
我有一个来自后端的纯HTML。 我想在HTML中包含/注入/添加React组件到具有特殊id
div
中并正确呈现它。 我想我应该用dangerouslySetInnerHTML
(或html反应解析器)和ReactDOM.render
,但ReactDOM.render
没有一个阵营组件内工作。 有没有办法做到这一点。 我的建议似乎根本不对:
export default class MainBoard extends Component {
constructor(props) {
super(props);
this.state = {content: { __html: "" }};
};
componentWillMount() {
const dinamicHTML = { __html: "<div class='dinamic-content'><h4 class='content-header'>Dinamic content header</h4><div id='test-component'>This content is dynamically added.</div></div>" };
this.setState({ content: dinamicHTML});
ReactDOM.render(<Menu />, document.getElementById('test-component'));
}
render() {
return (
<div className="main-content-wrapper">
<h3>MainBoard</h3>
<div className="dinamic-content-wrapper" dangerouslySetInnerHTML={this.state.content} />
</div>
);
}
}
至于尝试在componentWillMount
内部呈现Menu,您几乎可以肯定要重组您的组件层次结构。 例如:
<Container>
<Menu />
<MainBoard />
</Container>
您实际上应该只调用一次ReactDOM.render
。
现在到主要问题,没有办法代替从服务器接收JSON吗? 如果没有,我认为您在使用dangerouslySetInnerHTML
会陷入困境。 您最好在componentDidMount
而不是componentWillMount
内部执行此操作。 例如:
componentDidMount() {
requestHTML().then(html => this.setState({ content: { __html: html } }))
}
requestHTML
的实现取决于您。
确实,唯一地使用dangerouslySetInnerHTML
的SetInnerHTML做到这一点。
现在,正如您提到的那样,这不是一个特别好的方法,具体取决于此HTML的来源。 如果用户可以通过任何方式在其中插入内容,那么您很快就会遇到跨站点脚本的情况。
但是,如果您信任HTML,则可以使用您正在做的事情。
是的,这是可行的。 您可以使用ReactDOM.render在HTML元素中注入一个React组件。
但是我会重新考虑其他方法。 为什么不返回JSON而不是HTML? 否则,您将得到此奇怪的代码。
const Menu = props => <div>menu</div>;
class App extends React.Component {
render() {
return (
<div className="main-content-wrapper">
<h3>MainBoard</h3>
<div ref={el => (this.dynamicContentWrapper = el)}
className="dynamic-content-wrapper" />
</div>
);
}
componentDidMount(){
const htmlFromAjax = `
<div class='dynamic-content'>
<h4 class='content-header'>Dynamic content header</h4>
<div id='test-component'>This content is dynamically added.</div>
</div>`;
this.dynamicContentWrapper.innerHTML = htmlFromAjax;
ReactDOM.render(<Menu />, this.dynamicContentWrapper.querySelector('#test-component'));
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.