Это потому, что когда вы звоните addBlock
, вы только один раз визуализируете <DynamicComponent title={this.state.title} />
до <div id="dynamiccomopnents"></div>
.
Когда вы обновляете состояние title
, нажимая кнопку, запускает функцию render
вашего приложения, но this.addBlock
не запускается снова в вашей функции render
и, следовательно, ваш заголовок не обновляется. Вы можете проверить это, нажав кнопку, которая вызывает this.addBlock
еще раз. Он снова отобразит ваш компонент с обновленным заголовком.
Я бы предложил вам ввести какое-то состояние для условного отображения вашего компонента вместо использования ReactDOM.render
. Таким образом, ваш компонент перерисовывается каждый раз, когда запускается ваш метод render
. Вот пример:
import React from 'react';
import ReactDOM from 'react-dom';
const DynamicComponent = (props) => {
return (
<div style={{ 'border': '2px dotted green' }} >Dynamic Component : {props.title}</div>
)
}
class App extends React.Component {
state = {
title: 'Iam Title',
showBlock: false,
}
addBlock = () => {
// this method now sets `this.state.showBlock` to true
this.setState({ showBlock: true });
}
renderBlock = () => {
// return any component you want here, you can introduce some conditional
// logic or even return nested elements, for example:
return (
<div>
<p>Dynamic Component!</p>
<DynamicComponent title={this.state.title} />
</div>
);
}
render() {
return (
<div>
<div>Value in state: <b>{this.state.title}</b></div>
<p><b><DynamicComponent /></b> Added Initially</p>
<DynamicComponent title={this.state.title} />
<br />
<p><b><DynamicComponent /></b> Added By ReactDOM.render will be shown below: </p>
{/* This will run `this.renderBlock` only if `this.state.showBlock` is true */}
{this.state.showBlock && this.renderBlock()}
<button onClick={this.addBlock} >Click to Dynamic Component</button>
<button onClick={() => this.setState({ title: `Update Title` })} >Update Title</button>
</div>
)
}
}
ReactDOM.render(<App />, document.getElementById('root'));