ReactCompositeComponent.js
のGitHubのリアクションソースには、_processPendingState
というメソッドがあります。これは、component.setStateの呼び出しから状態をマージする究極の方法です。
`` ` _processPendingState:function(props、context){ var inst = this._instance; var queue = this._pendingStateQueue; var replace = this._pendingReplaceState; this._pendingReplaceState = false; this._pendingStateQueue = null;
if (!queue) {
return inst.state;
}
if (replace && queue.length === 1) {
return queue[0];
}
var nextState = replace ? queue[0] : inst.state;
var dontMutate = true;
for (var i = replace ? 1 : 0; i < queue.length; i++) {
var partial = queue[i];
let partialState = typeof partial === 'function'
? partial.call(inst, nextState, props, context)
: partial;
if (partialState) {
if (dontMutate) {
dontMutate = false;
nextState = Object.assign({}, nextState, partialState);
} else {
Object.assign(nextState, partialState);
}
}
}
`` `マージを実装し、実際のラインを見ることができるコードで
。
nextState = Object.assign({}, nextState, partialState);
どこにもこの機能では、それは本当に行動を意図していない意味delete
または類似の呼び出しは、ありません。また、setStateは常にマージであるため、statを完全にコピーし、プロパティを削除し、setStateを呼び出すことはできません。したがって、deletedプロパティは無視されます。
また、setStateはすぐには機能しませんが、バッチが変更されるため、状態オブジェクト全体を複製して1つのプロパティの変更のみを試みると、以前のsetStateの呼び出しを消去する可能性があります。 Reactの文書によれば、
リアクションでは、複数のsetState()呼び出しを1つのアップデートにまとめてパフォーマンスを向上させることができます。
this.propsとthis.stateが非同期に更新される可能性があるため、次の状態を計算するためにその値に依存するべきではありません。
実際にはもっと情報を追加することができます。
this.setState({ xSet: true, x: 'foo' });
this.setState({ xSet: false, x: undefined });
これは許可され、醜いですが、それはあなたがundefinedに設定された値、およびすべてで設定されていない値を区別するために必要な情報の余分な部分を提供します。加えて、Reactの内部、トランザクション、状態変更のバッチ処理、その他の恐怖にはうってつけです。2番目の推測を試みるよりも複雑さを増やす方が良いでしょう。トランザクション調整のような恐怖、replaceStateのような非難される機能の管理などに繋がります。
これらのソリューションの両方とも間違っています。第1の理由は、 'Object.assign()'は[深いクローンを行いません](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign #Deep_Clone)ので、より複雑なアプリケーションを意識せずに状態を直接変更する可能性があります。 2つ目の問題は両方のソリューションで発生し、@ alexander-tの答えと同じです。 Object.keys()からキーを削除しているわけではありません。あなたはその価値を変えているだけです。 – Vince
はい、私はObject.keysについて知っていますが、私の応答は問題を解決します。そして、あなたは私に2回downvoteとして悪い気性を持っています。 – MiF
このトピックは私にとって感情的な意義はなく、誰も2度投票することはできません。私はあなたの答えを一度投票しました。なぜなら、それは質問によって引き起こされた問題を解決しないからです。しかし、どのようにしてこの問題が解決するのかよく分かりません。状態オブジェクトのプロパティを反復してリストやテーブルを作成する場合、そのうちの1つの値を 'null' /' undefined'に設定すると、少なくとも空のリスト項目やテーブル行が生成されます。コードが子オブジェクトのプロパティを使用するように記述されている場合、値を 'null' /' undefined'に設定すると、トラブルシューティングが困難なエラーが発生します。 – Vince