gpt4 book ai didi

reactjs - this.forceUpdate() 不重新渲染动态创建的组件

转载 作者:行者123 更新时间:2023-12-05 07:34:06 29 4
gpt4 key购买 nike

假设已经定义了所有不同的组件。

在我的 React 组件中,我希望单击按钮触发附加一个新的 TextBox我动态创建的组件 questions成分。当我用 forceUpdate() 测试按钮点击时, 一个 TextBox已成功附加到 questions但没有明显添加新的 TextBox元素。我使用 <h4>Random number : {Math.random()}</h4> 测试了组件是否真的重新渲染了事实证明组件正在这样做,因为每次我按下按钮时数字都会改变。

有什么地方做错了吗?

constructor (props) {
super(props);
this.questions = [];
this.questions.push(<TextBox key={this.questions.length}/>);
this.createTextBox = this.createTextBox.bind(this);
this.loadTextBox = this.loadTextBox.bind(this);
}

createTextBox() {
this.questions.push(<TextBox key={this.questions.length}/>);
this.forceUpdate();
}

loadTextBox() {
return (this.questions);
}

render() {
return(
<div>
<h4>Random number : {Math.random()}</h4>
{this.loadTextBox()}
<ButtonToolbar className="add-question">
<DropdownButton bsSize="large" title="Add" id="dropdown-size-large" dropup pullRight>
<MenuItem eventKey="1" onClick={this.createTextBox}>Text Box</MenuItem>
</DropdownButton>
</ButtonToolbar>
</div>
);
}

最佳答案

只有 this.state 中的项目才会被 React 正确监控是否应该发生重新渲染。使用 this.forceUpdate 不会检查 this.questions 是否已更改。

使用 this.questions 作为 this.state.questions。当你这样做时,不要改变 this.state.questions。相反,制作一个新副本并在其上使用 this.setState

constructor (props) {
super(props);
this.state = {
questions: [<TextBox key={0}/>]
}
this.createTextBox = this.createTextBox.bind(this);
this.loadTextBox = this.loadTextBox.bind(this);
}

createTextBox() {
const newQuestions = [...this.state.questions, <TextBox key={this.questions.length}/>]
// or you can use
// const newQuestions = this.state.questions.concat(<TextBox key={this.questions.length + 1}/>)
this.setState({questions: newQuestions})
}

loadTextBox() {
return (this.state.questions);
}

需要注意的一件重要事情是几乎从不需要 this.forceUpdate。如果您发现自己在使用它,那么您正在以一种非最佳方式编写代码。我对您的代码进行了一些关于如何分配键的修改。您应该检查更新的唯一原因是 this.state 中的某些内容是否已更改,这涉及使用 this.setState

关于reactjs - this.forceUpdate() 不重新渲染动态创建的组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50312648/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com