javascript - React - 如何在父状态组件更改时强制子组件重新渲染?

标签 javascript reactjs ecmascript-6

在我的笔下http://codepen.io/seunlanlege/pen/PbYNor?editors=0010#0

发生的事情非常简单。当this.send()方法被调用。 this.state.chat被发送到子组件 <Messages /> which is then concatenated to the this.state.messages` 数组并呈现。

但问题是,渲染后 1 秒我更新了 this.state.sent这是 <Messages /> 的 Prop 但消息组件不会重新呈现。

请问我如何强制它重新渲染?

class Messages extends React.Component{
constructor(props){
super(props);
}
render(){
return(
`<p id={this.props.key} className={this.props.style}>{this.props.msg}<span>{this.props.sent}</span></p>`);
}
}


class Chat extends React.Component {
constructor(props) {
super(props);
this.count = 0;
    this.state = {chat :'',messages:[],sent:[]}; 
}
chatChange(event){
    this.setState({chat : event.target.value});
}
send(e){
    e.preventDefault();
    let x = this.state.messages;
    this.setState({messages:x.concat([<Messages style="me" msg={this.state.chat} key={this.state.chat} sent={(this.state.sent[this.count])?this.state.sent[this.count]:''} />])});
this.setState({chat:''});
setTimeout(()=>{
  this.setState({sent:this.state.sent.concat(['sent'])});
  this.count++;
},1000);
}
render () {
    return(
        `<div>
        <div id="top"><h1>Chat With Customer Support</h1></div>
        <div id="chatbox">
        {this.state.messages}
        </div>
        <div id="bottom">
        <form onSubmit={this.send.bind(this)}>
        <span>
        <input value={this.state.chat} type="text" onChange={this.chatChange.bind(this)} id="chat" value={this.state.chat} />
        <button type="submit" id="send">Send</button>
        </span>
        </form>
        </div>
        </div>`
        );
}
}ReactDOM.render(<Chat name="seun" />,document.getElementById('app')):</code>

最佳答案

您的 codepen 几乎没问题,您唯一遗漏的是消息组件的正确 key ,

为了正确地渲染组件,每个组件应该有不同的键,所以我改变了这段代码

<Messages style="me" msg={this.state.chat} key={this.state.chat} sent={(this.state.sent[this.count])?this.state.sent[this.count]:''} />

<Messages style="me" msg={this.state.chat} key={this.count} sent={(this.state.sent[this.count])?this.state.sent[this.count]:''} />

代码笔工作正常

编辑 这解决了问题

与其将组件保存到状态,不如动态构建它们。检查这个codepen.io/abhirathore2006/pen/JbjjPx

关于javascript - React - 如何在父状态组件更改时强制子组件重新渲染?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40398078/

相关文章:

javascript - react setTimeout - 内存泄漏

javascript - 如何console.log从异步api调用检索到的数据?

dart - dart2js是否支持ecmascript 6编译?

javascript - knockout 绑定(bind)自定义组件,使其不与中心 View 模型冲突

javascript - dust.js 模板数据更新

javascript - jQuery UI 可调整大小的两个对象

javascript - AJAX 请求后函数语句被调用 1 次以上?

reactjs - 显示自定义对话框setRouteLeaveHook或history.listenBeforereact-router/redux?

javascript - 无法识别 Protractor 中的 css/xpath 元素

typescript - 声明一个变量,有一个键是两种类型的串联