我正在制作一个简单的反应应用程序,用户可以在其中创建列表和项目。我正在努力找出如何将数据从子组件传递到父组件并更新状态。
我将子组件(AddItem)中的输入数据传递给父组件(App)。
// AddItem.js
class AddItem extends Component {
constructor() {
super();
this.state = {
items: []
}
}
handleSubmit(e) {
e.preventDefault();
var newItem = {
name : this.refs.id.value};
if(this.refs.id.value ===''){
alert('Add list')
} else {
this.setState({
items: this.state.items.concat(newItem)
}, function(){
this.props.addItem(this.state.items);
});
console.log(this.state.items) // this print out Array with data
}
}
render() {
var divName = 'add' + this.props.idName;
return (
<div className='addItemDiv'>
<h4>Add {this.props.idName}</h4>
<form ref='form' onSubmit={this.handleSubmit.bind(this)}>
<div id={divName} ref={divName}>
<label>Name</label><br />
<input type='text' ref='id' />
</div>
<br />
<input type='submit' value='Submit' />
<br />
</form>
</div>
);
}
}
// App.js
class App extends Component {
constructor() {
super();
this.state = {
lists: [],
items: {}
};
}
handleAddList(list) {
let lists = this.state.lists;
lists.push(list);
this.setState({
lists: lists
})
}
handleAddItem(item) {
console.log(this.state.items) // it print out {}. Data is not passed.
}
render() {
return (
<div className="App">
<AddList addList={this.handleAddList.bind(this)} />
<div id="listsDiv" className="List">
<Lists lists={this.state.lists} items={this.state.items} addItem={this.handleAddItem.bind(this)} />
</div>
</div>
);
}
}
正如我在评论中添加的那样,AddItem.js中的this.state.items
包含数组数据但是当我将它传递给App.js中的父组件时,this.state.items
为空。我怀疑在AddItem.js中没有正确调用该函数,并且数据未传递给App.js.
但我自己也无法弄明白。非常感谢您的帮助。
谢谢,
答案 0 :(得分:1)
运行时,代码中发现了2个问题。
注意:我注释掉了列表组件。
{/*<div id="listsDiv" className="List">*/}
{/*<Lists lists={this.state.lists} items={this.state.items} addItem={this.handleAddItem.bind(this)} />*/}
{/*</div>*/}
(1)您没有将道具'addItem'传递给Component AddItem。
<AddList addList={this.handleAddList.bind(this)} addItem={this.handleAddItem.bind(this)}/>
(2)Handle Item正在记录错误的字段。
handleAddItem(items) {
console.log(items);
}
现在,我可以看到值被冒泡到App。
由于 Sriram Narasimhan
答案 1 :(得分:0)
函数handleAddList覆盖列表,状态仅包含列表
handleAddList(list) {
let lists = this.state.lists;
lists.push(list);
this.setState(prevState => ({
...prevState,
lists: lists
}));
}