2017-10-17 22 views
1

これは簡単なはずですが、私が必要とする簡単な答えは見つかりません。React Reduxレデューサーの配列オブジェクトを更新してください

const posts = (state = null, action) => { 
    switch(action.type){ 
    case "PUBLISH_POST": 
     return state; 
    case "UNPUBLISH_POST": 
     return state; 
    default: 
     return postList; 
    } 
} 

私はID年代とstatusとの投稿のリストを持っている:私は、減速機を持っています。私は自分の投稿IDを送信していますが、クリックされた項目のstatusを0から1に更新するロジックを理解することはできません。私は多くのハーフソリューションを見つけましたが、それらはすべて冗長で醜いように見えます - この場合、それを達成する最短/最善の方法は何ですか?

例データ:単純にそれのためspread operatorを使用

{ 
    type: 'UNPUBLISH_POST', 
    payload: { 
    id: 1, 
    user: 'Bob Smith', 
    content: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque vulputate mauris vitae diam euismod convallis. Donec dui est, suscipit at dui vitae, sagittis efficitur turpis. ', 
    status: 1 
    } 
} 

const posts = (state = null, action) => { 
    switch(action.type){ 
    case "PUBLISH_POST": 
    case "UNPUBLISH_POST": 
     const index = this.state.findIndex(post => post.id === action.payload.id) 

     return [ 
      ...state.slice(0, index), // everything before current post 
      { 
       ...state[index], 
       status: action.type === 'PUBLISH_POST' ? 1 : 0, 
      }, 
      ...state.slice(index + 1), // everything after current post 
     ] 
    default: 
     return postList; 
    } 
} 
+0

あなたはどのように見えるのですか?投稿の配列ですか? – mersocarlin

+0

@mersocarlinはい、上記の例 –

+0

アクションペイロードとは何ですか? – Jaxx

答えて

2

のようなものですあなた以外の他のデータposts配列:

const posts = (state = null, action) => { 
    const post = state.posts.find(p => p.id === action.payload.id); 
    switch(action.type) { 
    case "PUBLISH_POST": 
     return { ...state, posts: [ ...state.posts.filter(p => p === post), { ...post, status: 1 } ] }; 
    case "UNPUBLISH_POST": 
     return { ...state, posts: [ ...state.posts.filter(p => p === post), { ...post, status: 0 } ] }; 
    default: 
     return state; 
    } 
} 
+0

ありがとうございます。私は「これ」を削除しなければならなかった。状態から。私は、2つの条件ではなくトグルだけではできないことを理解しています。 –

+0

@MattSaundersようこそ。私はあなたの 'state'のデフォルトが' null'になっていることに気付きました。おそらくそれを空の配列として初期化して、それで将来問題が発生することはありません:) – mersocarlin

+0

[immutability-helper](https://github.com/kolodny/immutability-helper)モジュールをパターン[ここ](https://stackoverflow.com/questions/40276907/updating-the-array-object-in-react-state-using-immutability-helper)に記載されています。 –

1

より一般的な解決策、状態が含まれている場合は特に、あなたのactionを想定し

{ 
    id:1, 
    user:"Bob Smith", 
    content:"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque vulputate mauris vitae diam euismod convallis. Donec dui est, suscipit at dui vitae, sagittis efficitur turpis. ", 
    status:1 
} 
関連する問題