私はちょうど拾っ開始react.jsを私はチュートリアルの多くを通り抜けたので、私は基本的に状態から項目を削除することを意図し、このビットにつまずいてきました。
これは、男は私に削除機能を導入する方法であります
delTodo = id => {
this.setState({
todos: [...this.state.todos.filter(todo => todo.id !== id)]
});
};
私はJavaScriptを使用それほど慣れていないよので、私は何を考え出す苦労していた...
彼は与えられたシナリオで、それを使用している理由を正確に演算子がやっとされます。だから、それがどのように動作するかをよりよく理解しているために、私は、コンソール内のビットを演奏し、私はそれを実現しましたarray = [...array]
。しかし、それは本当ですか?このビットは、上記のものとまったく同じことをやっていますか?
delTodo = id => {
this.setState({
todos: this.state.todos.filter(todo => todo.id !== id)
});
};
彼はそのアプローチの代わりに、私が作ってみたものを使用することにすることを選択した理由を、より経験豊富な誰かが私に明確にもらえますか?
ドキュメントごとのように:
変異することはありません
this.state
呼び出すと、直接setState()
その後はあなたが作った突然変異を交換することができます。トリートthis.state
それはであるかのようにimmutable
。
だから、あなたが言及したチュートリアルの例では、あなたの状態を更新するために、配列のコピーを作成する必要はありません。
// GOOD
delTodo = id => {
this.setState({
todos: this.state.todos.filter(...)
})
}
Array.filter
この方法は、新しい配列を作成し、元の配列を変異させていない、したがって、それは直接あなたの状態を変化させません。同じことは、次のような方法に適用されますArray.map
かArray.concat
。
あなたの状態が配列され、あなたが変更可能な方法を適用している場合は、あなたの配列をコピーする必要があります。
これを把握する多くの参照Array
方法が変更可能です。
しかし、あなたは次のような何かをした場合:
// BAD
delTodo = id => {
const todos = this.state.todos
todos.splice(id, 1)
this.setState({ todos: todos })
}
そして、あなたはので、直接あなたの状態を変異されると思いArray.splice
、既存の配列の内容を変更するのではなく、特定の項目を削除した後に新しい配列を返します。したがって、あなたは、拡散演算子を使って配列をコピーする必要があります。
// GOOD
delTodo = id => {
const todos = [...this.state.todos]
todos.splice(id, 1)
this.setState({ todos: todos })
}
同様にしてobjects
、あなたは同じ手法を適用すべきです。
// BAD
updateFoo = () => {
const foo = this.state.foo // `foo` is an object {}
foo.bar = "HelloWorld"
this.setState({ foo: foo })
}
上記の直接変異し、あなたの状態、あなたがコピーを作成して、あなたの状態を更新する必要がありますので。
// GOOD
updateFoo = () => {
const foo = {...this.state.foo} // `foo` is an object {}
foo.bar = "HelloWorld"
this.setState({ foo: foo })
}
お役に立てれば。