2017-01-26 10 views
1

私はかなり標準化されたエンティティストアでRedux、React、Lodashを使用しています。Redux、正規化されたエンティティとlodashのマージ

redux reducerの新しいエンティティをマージすると、既存のすべてのエンティティへの参照が変更されずに変更され、純粋なコンポーネントの再レンダリングが発生します。

lodashのマージの代わりに、マージされるオブジェクトにない値への既存の参照を維持しながらマージすることはできますか?

let entities = { 
    [1]: {a: true }, 
    [2]: {a: true, b: true }, 
} 
let response = { 
    [2]: {a: false } 
} 
let newEntities = _.merge({}, entities, response) 

console.log(entities[1] === newEntities[1]) // false 

私はその後、newEntities[2].bが削除され、ここでスプレッドObject.assign/ES6を使用することはできません。

私は、カスタムsCUや再選択などの代替ソリューションがあることを認識していますが、その小道具の等価参照チェックを行うすべてのコンポーネントを変更する必要はなく、レデューサーレベルでこれを処理する方がはるかにクリーンです。

答えて

0

カスタマイザで使用mergeWith

let keepRef = (objValue, srcValue) => (
    objValue === undefined ? srcValue : _.mergeWith({}, objValue, srcValue, keepRef) 
) 
let newEntities = _.mergeWith({}, entities, response, keepRef) 
関連する問題