2016-10-23 2 views
1

正規化されたReduxデータ構造が文字列IDでインデックスされています。他のプロパティの中でも、状態の各オブジェクトにはsequenceNumberがあり、リストまたはグリッドで順に表示するために使用されます。アイテムをドラッグ&ドロップすると、アイテムを並べ替えることができます。正規化されたReduxデータ構造内のオブジェクトの順序を並べ替える

私は、シーケンス番号を更新するためにきれいで純粋なアプローチを見つけるのに苦労しています。 Redux減速機でこれを行う良い方法は何ですか?


私の現在のstateデータ構造は、基本的に次のとおりです。

{ 
    'asdf': { title: 'Item 1', sequence: 0, ... }, 
    '1234': { title: 'Item 2', sequence: 1, ... }, 
    'zzzz': { title: 'Item 3', sequence: 2, ... } 
} 

私の行動は状態に

{ 
    'asdf': { title: 'Item 1', sequence: 1, ... }, 
    '1234': { title: 'Item 2', sequence: 0, ... }, 
    'zzzz': { title: 'Item 3', sequence: 2, ... } 
} 

私の現在の減速機の用途をもたらすべきである

{ type: REORDER_ITEMS, oldRow: 1, newRow: 0 } 

ですObject.keys(state).reduce()を使用して項目をループし、希望の行番号よりも大きいか小さいかによって、sequenceを1つずつ変更します。これを管理するためのより良い方法はありますか?

答えて

2

さらにステップを正規化することができます。シーケンスを別の状態スライスで抽出し、その順序をIDの配列として格納します。

{ 
    items : { 
    'asdf': { title: 'Item 1', ... }, 
    '1234': { title: 'Item 2', ... }, 
    'zzzz': { title: 'Item 3', ... } 
    }, 
    sequence: ['1234', 'asdf', 'zzzz'] 
} 

このようにして、配列操作を使用してシーケンスを変更するアクションを処理する別のレデューサーを持つことができます。

+0

ええ、元の例は実際には完全には正規化されていません。標準的な方法は、IDで項目のルックアップテーブルを作成し、配列を使用して項目の順序を追跡することです。このトピックの詳細については、Reduxドキュメントの「構造化レジューサー」を参照してください。http://redux.js.org/docs/recipes/StructuringReducers.html – markerikson

+0

おっと、おそらく自分自身を考えていたはずです!ありがとう –

関連する問題