2015-10-07 65 views
4

我是新來的反應redux世界,並有一些麻煩可視化一塊複雜的數據流(我認爲)。React REDX最喜歡的動作

假設該狀態包含軌道集合和最喜歡的軌道ID數組。用戶可能喜歡來自多個不同組件的軌道,例如音樂播放器,曲目,圖表和所有其他人將不得不放棄。

此刻,我正在觸發一個動作,以添加/刪除收藏夾陣列中的曲目ID。但我不太明白如何從那裏開始。

我的計劃是觸發另一個動作,例如, trackItem減速器收聽並繼續。或者每個相關組件都可以直接訂閱收藏夾集合的更改?或者我可以讓兩個減速器聽同樣的動作嗎?我現在已經想到如何實現這樣的事情,並且我有一種直覺,認爲我走錯了路。

感覺我正在努力擺脫我的骨幹牽線木偶的習慣。你會怎麼做?

我的另一個計劃是在軌道項目json中有一個isFavorited布爾值,並使用動作/減少來更新/切換該屬性。我知道normalizr將合併具有相同ID的實例,因此訂閱其更改的任何組件都將作出反應。

+0

你真的需要擺脫你的Backbone.Marionette習慣。這有點痛苦,但你幾乎在那裏。 :) – xBill

回答

2

或者可以各自相關的部分直接訂閱 收藏夾收藏

他們可以變化。但是,這些組件是否都共享一些父組件?如果是這樣,我會讓該父組件訂閱收藏夾數組的狀態更改,並將其作爲道具傳遞給需要它的組件。

我會建議真的通過了Redux文檔閱讀:https://rackt.github.io/redux/

有特別用法陣營:https://rackt.github.io/redux/docs/basics/UsageWithReact.html

通常你會呈現爲路線的「智能」組件,這將訂閱還原存儲並傳遞嵌套的「啞」組件所需的數據。

因此,您的智能組件需要訂閱收藏夾陣列的狀態更改,並將其作爲道具傳遞給需要它的組件。

1

在一個以上的reducer中聽一個動作是可以的,所以也許沿着這條路線走?

你的組件是否共享共同的父組件?如果他們這樣做,connect它到您的redux應用程序狀態並傳遞給每個最喜愛的ID數組;然後從任何部件派遣動作addFavremoveFav,在favorites減速器中作出反應,並看到減速器通過新的道具來反應部件。

2

我覺得你應該首先了解reactjs中的智能組件和愚蠢組件,這裏是link,所以你將有一個智能的連接到你的reducer並更新你的孩子(愚蠢的)組件。

如果你仍然想要有兩個reducer,你可以有一個action來執行它的操作,因爲它調用了另一個action。要實現這一點,你需要有一個redux-async-transitions,示例代碼如下

function action1() { 
return { 
    type: types.SOMEFUNCTION, 
    payload: { 
    data: somedata 
    }, 
    meta: { 
    transition:() => ({ 
    func:() => { 
    return action2; 
    }, 
    path : '/somePath', 
    query: { 
    someKey: 'someQuery' 
    }, 
    state: { 
    stateObject: stateData 
    } 
    }) 
    } 
} 
}