2017-04-19 60 views
0

我的商店包含一個數組,我在用戶單擊按鈕時追加新項目。這些項目的內容取決於在商店其他地方設置的標誌。在反應中,如何訪問動作創建者內部的狀態?

例如,如果用戶先前已啓用「設置X」,則新陣列項目應該包含{ type: 'x'}而不是默認{type: 'y'}

我明白如何分配一個動作來執行新的數組項目的添加,但我無法弄清楚如何編寫狀態其他部分的動作。

我的問題:

  1. 我真的需要在這裏使用redux-thunk?我無法找到一個最終不會回落的單一SO答案。

  2. 我是React的新手,想了解爲什麼這不可能是默認的。這是否都是因爲用戶點擊按鈕和被分派的動作之間的狀態可能會有所變化?

  3. 有沒有一個更明顯/哈克的方法我失蹤要做到這一點?我已經使用ownProps試圖mapDispatchToPropsownProps似乎只包含道具connect()提供和「設置X」 其所提供。

+1

你可以使用一個事實,即每個減速器實際處理每一個狀態變化採取行動2個不同的減速器。所以你可以在2個reducer中使用相同的case語句。 – cheesemacfly

+0

你的意思是使用reducer A創建新的數組項,但沒有任何'type',但以某種方式識別它,所以第二個reducer B可以用'type''升級'這個新的數組項?這聽起來像是對我來說維護混亂的祕訣。 – xcession

+0

好的,但這就是你所描述的情況。或者我錯過了什麼?也許如果你可以拋出一些代碼,我們可以看看它會更容易:) – cheesemacfly

回答

-1

function reducer1(state = {x: true}, action) { 
 
    switch (action.type) { 
 
    case 'SOME_CHANGE': 
 
     return { 
 
     ...state, 
 
     x: action.data.bool, 
 
     } 
 
    default: 
 
     return state; 
 
    } 
 
} 
 
function reducer2(state = {y: [1]}, action) { 
 
    switch (action.type) { 
 
    case 'SOME_CHANGE': 
 
     return { 
 
     ...state, 
 
     y: [...action.data.arrayStuff], 
 
     } 
 
    default: 
 
     return state; 
 
    } 
 
}

1

我不明白你的要求,但如果你只是想更新的一些設置的商店,你可以試試這個:

  1. 創建更改設置的動作以及將商店中的設置保存到設備中的減速器

    dispatch({ 
        type: 'CHANGE_SETTING', 
        flag: X, 
    }) 
    
  2. 隨着redux-thunk,創建另一個動作, 它可以使用getState擺脫賣場的設置,

    const updateArrayBySetting = (dispatch, getState) => { 
        if (getState().setting === 'X') { 
         dispatch(updateArray()) // contain type 'X' 
        } 
        if (getState().setting === 'Y') { 
        } 
    }