1

必須プログラムの最も重要な機能は、状態とその変更です。不変状態はReactJの機能的な機能ですか?

ReactJsは、プログラミングの機能スタイル(例:純度、高次関数を使用)を奨励します。私はReactJsでimmutable stateを使用しているかどうかを知りたがっていますが、この特徴はまだ必須の機能であるか、機能的な「スタイルの状態」と考えることができますか?

理論的には、純粋な命令型プログラムの反応状態と状態の違いは何ですか?

答えて

2

理論的には、純粋な命令型プログラムの反応状態と状態の違いは何ですか?

  • は状態は、物事をレンダリングする方法を説明し反応します。
  • 命令状態を列挙します。必要なステップは状態Aから状態Bになります(命令されたプログラムの最も重要な機能は状態とその変更です)。

Reactで状態(this.setStateを使用)を更新する目的はすべて、状態が更新されたことをコンポーネントに通知し、再レンダリングが必要なことです。

しかし最終的には、Reactの状態Aから状態Bに変更したい場合は、イベントハンドラの内部で行います。必要に応じて実行することができますが、実際には変更しないで初期状態。例えば

// OK 

let foo = this.state.foo; 
foo = deriveSomeValue(foo); 
this.setState({ foo }); 

// BAD 

this.state.foo = deriveSomeValue(foo); 
this.setState(this.state); 

最初の例(OK)では、ある程度の不純物が確認できます。 fooは変更されていますが、少なくとも元の状態は変更されていません。

第2の例(BAD)では、同じレベルの不純物を有するが、悪化する。私たちは現在の状態を直接変更しており、予測できない結果を生む可能性があります。 「this.stateでXを実行すると、なぜ正しくレンダリングされないのですか?」と尋ねる人々に、Stack Overflowの投稿が多すぎます。言い換えれば、この不変性のパラダイムは実用的な理由から強制されます。それはReactが働くように設計された方法であり、他の方法では(ケースバイケースで)未定義の挙動が得られます。予測不可能な結果を​​もたらすことができる

別の例:この場合には、状態はまだ今までリアクト通知する前に更新され、

const foo = this.state.foo; 
foo.someProperty = getSomeValue(); 
this.setState({ foo }); 

。 (これは、暗黙的にコピーされるのではなく、オブジェクトがexplicitly referencedであることを意味します)。

実際、イベントハンドラ内の命令型でReactの状態Aから状態Bに移行できますが、初期状態が直接変更されないことを示します。複雑な変更が必要な場合は、deep copyのオブジェクトを実行してから、必要な変更を行うことをお勧めします。以下は完全に罰金です:

const foo = cloneObject(this.state.foo); 
// `cloneObject` is an entirely contrived function. You'll have to pick a 
// deep copying library. Google around for "JavaScript deep copying" 
foo.someProperty = getSomeValue(); 
this.setState({ foo }); 

あなたは(意味的に呼ぶことができるものを)直接プロパティを変更している場合、それは必ずしも変更することなく、完全に新しいオブジェクトを生成するように、また、あなたは、不変のデータ構造を使用することができますオリジナル。そのための良い図書館は(あなたが言及したように)ImmutableJSでしょう。

let foo = this.state.foo; 
foo = foo.set('someProperty', getSomeValue()); 
this.setState({ foo }); 
関連する問題