当我们使用ReactDOM.render(<Component/>,document.getElementById("container"));
时,组件会被渲染到提到的元素。如果这里的div已经有一些现有内容怎么办?可以React将渲染的组件附加到它吗?例如:
HTML:
<div id = "container">Hello, React!</div>
JSX:
var Component = React.createClass({
render: function(){
return(
<p>Hello to you too!</p>
)
}
})
ReactDOM.render(<Component/>, document.getElementById("container"));
答案 0 :(得分:2)
据我所知,这是做你要求的唯一方法(因为我试图做同样的事情):
let divs = document.getElementsByClassName("some_class")
for (let i = 0; i < divs.length; i++) {
const id = Math.random() //or some such identifier
const d = document.createElement("div")
d.id = id
divs[i].appendChild(d)
ReactDOM.render(<SomeComponent/>, document.getElementById(id))
}
如果有人知道更简洁/更好的方式将react
组件附加到现有<div>
而没有先附加新的空<div>
,请加入!
答案 1 :(得分:1)
在div中呈现react组件时,其内容将被您创建的组件的内容替换。
<script src="https://facebook.github.io/react/js/jsfiddle-integration.js"></script>
<div class = 'outer-container'>
<p>
I can see this hello.
</p>
<div id="container">
<!-- This element's contents will be replaced with your component. -->
<p>
Hello React
</p>
</div>
</div>
JSX
var Hello = React.createClass({
render: function() {
return (
<div className="Button">
<span className="left" onClick={function() {alert("left")}}>Left</span>
<span className="right" onClick={function() {alert("right")}}>Right</span>
<span className="middle" onClick={function() {alert("middle")}}>Middle</span>
</div>
);
}
});
ReactDOM.render(<Hello name="World" />, document.getElementById('container'));
你可以在这里看到一个小提琴:JSFIDDLE
答案 2 :(得分:0)
你必须有一些包装容器,用于你不想被覆盖的东西。它应该是这样的:
<div id='wrapper-container'>
<p>Hello, React! Content before</p>
<div id='container'></div>
<p>Content after</p>
</div>
答案 3 :(得分:0)
是的,可以使用dangerouslySetInnerHTML
保留现有内容。考虑到这个名称,您可能已经猜到这不是最建议的方法,但是它起作用:
HTML:
<div id = "container">Hello, React!</div>
JS:
var Component = React.createClass({
render: function(){
return(
<div>{this.props.children}<p>Hello to you too!</p></div>
)
}
})
var c = document.getElementById("container");
ReactDOM.render(React.createElement(Component, {}, <div className="children"
dangerouslySetInnerHTML={{ __html: c.innerHTML }}></div>), c);
查看此fiddle可以看到它的实际效果。