私はユーザーがリストとその中のアイテムを作成できる簡単な反応アプリケーションを作っています。私は子供から親コンポーネントにデータを渡して状態を更新する方法を見つけるのに苦労しています。状態が更新される前に関数を呼び出し、親コンポーネント/ React.jsにデータを渡します。
子コンポーネント(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に渡されないことを疑う。
しかし、私は自分でそれを理解することはできません。あなたの親切な助けに感謝します。
は
handleAddList(list) {
let lists = this.state.lists;
lists.push(list);
this.setState(prevState => ({
...prevState,
lists: lists
}));
}
くぼみを追加することにより、適切にあなたのコードをフォーマットしてください。 – Chris
自分のコードを編集します。 – aaayumi