我正在尝试在React中创建一个记笔记应用程序。 当按下“添加注释”按钮并在输入框中输入值时,应用程序应添加一个新注释。
不幸的是,当我尝试将注释推到列表中并更新父项时,状态更改未反映在屏幕上或反应调试器中。
将新注释推送到列表可以在警报行中看到,而在其他任何地方都看不到。
以下是包含原始注释状态的父组件:
class NoteApplication extends React.Component {
constructor(props) {
super(props);
this.state = {
notes: Array(),
};
this.update = this.update.bind(this);
this.state.notes.push("Sample note");
}
update(notes) {
return () => {
this.setState({
notes: notes
});
}
}
render() {
return (
<div>
<h1>React Notes</h1>
<div class="InsertBarDiv">
<InsertBar
notes={this.state.notes}
update = {this.update}
/>
</div>
<div class="NotesDiv">
<Notes
notes={this.state.notes}
/>
</div>
</div>
)
}
}
这是子组件
class InsertBar extends React.Component {
constructor(props) {
super(props);
this.state = {value:''};
this.handleChange = this.handleChange.bind(this);
this.handleSubmit = this.handleSubmit.bind(this);
}
handleChange(event) {
this.setState({value: event.target.value});
}
handleSubmit(event) {
const notes = this.props.notes.slice();
notes.push(this.state.value);
this.props.update(notes);
alert(notes);
event.preventDefault();
}
render() {
return (
<div>
<form onSubmit={this.handleSubmit}>
<input class="noteInsertBar" type="text" name="" onChange={this.handleChange}/>
<input class="insertBut" type="submit" value="Add Note"/>
</form>
</div>
)
}
}
class Notes extends React.Component {
renderNote(i) {
return (
<div>
{this.props.notes}
</div>
)
}
render() {
return (
<div>
<h2>Notes:</h2>
<div class="FullNote">
{this.renderNote(1)}
</div>
</div>
)
}
}
我希望该注释会被推送到注释列表的副本中,而家长的状态会被设置为该注释列表的新副本。
然后我希望它会显示在屏幕上。
答案 0 :(得分:1)
由于用户@WasaWasaWassup,我在反应不协调方面获得了一些帮助,所以我想分享解决我的问题的方法。
在构造函数中更改父状态以添加示例注释会导致问题。
第二个问题是我的更新函数返回了一个尚未被调用的函数。
删除构造函数以更改和更改我的update函数,使其仅设置状态而不使用嵌入式函数,即可解决我的所有问题,并且notes数组会更新并正确显示。
答案 1 :(得分:1)
很可能是由于您要从update
返回一个函数,您应该在调用setState
时才调用update
:
update(notes) {
setState({ notes });
}
侧面说明:在React中处理数组时,应避免使用Array.push
。这样做的方式很好,因为在推送之前您要调用slice
来复制数组,但是如果使用concat
或spread运算符,则不太可能无意引入错误。
const notes = this.props.notes.concat(this.state.value);
或:
const notes = [...this.props.notes, this.state.value];