2

私はここから Redux と es7 を学ぼうとしていますが、次のコードについて以下の著者のポイントを理解するのに苦労しています:

また、この ES7 Object Spread 表記は、状態に対して { message: action.value } の浅いコピーを行っているため、この例に適していることに注意してください (つまり、状態の第 1 レベルのプロパティは、
第 1 レベルのプロパティによって適切にマージされるのではなく、完全に上書きされます) 。 { message: action.value })。

var reducer_3 = function (state = {}, action) {
    console.log('reducer_3 was called with state', state, 'and action', action)

    switch (action.type) {
        case 'SAY_SOMETHING':
            return {
                ...state,
                message: action.value
            }
        default:
            return state;
    }
}

作成者が Object Spread 表記法を使用してメッセージ: action.value キー/値のペアを元の状態に追加するだけの場合、状態の第 1 レベルのプロパティは {message: action.value} によってどのように上書きされますか? 状態のプロパティの第 1 レベルは、オブジェクト スプレッドの表記法のためにまだ残っていますか? したがって、{a:"foo", b:"bar"}アクションをディスパッチした後の元の状態が新しい状態だった場合は、正しいでしょうかSAY_SOMETHING? {a:"foo", b:"bar", message: 'SAY_SOMETHING}何も置き換えられませんでした。

4

1 に答える 1

1

既存のプロパティを置き換える IFF のみをオーバーライドします。したがって、あなたの例は正確です。著者は、既存のキーを上書きする浅いマージを行うと述べましたが、あなたが言ったように単にプロパティを追加する例を示しました。たぶん、明確にするためにPRを送ってください:)

スプレッド演算子を使用して新しいオブジェクトを作成する場合、最初の引数として空のオブジェクト リテラルを使用して、アンダースコア/ローダッシュのObject.assignまたは_.extendとまったく同じように動作します。したがって、これらはすべて同等です...

Object.assign({}, a, b)
_.extend({}, a, b)
{ ...a, ...b }

Babel REPLでわかるように、Babel は単純にこの構文を Object.assignに変換します (利用可能な場合)、または polyfill のObject.assign

于 2016-10-03T15:09:47.157 に答える