2017-05-09 188 views
0

我是redux的新手,我正嘗試創建一個完全的redux應用程序。我遇到的問題是我的減速器不會更新我的商店。如果我要在減速器中改變商店,那麼我會看到我的改變。我知道這是不好的做法,所以我正在嘗試更新它而沒有改變它,但是當我看着控制檯時。我看不到國家的變化。有人能幫我弄清楚爲什麼減速機沒有更新商店嗎?爲什麼我的減速器不能更新我的商店?

這是我的行動:

store.subscribe(() => { 
    console.log("store changed", store.getState()); 
}); 

這裏是我的減速器:

const fruitReducer = function(state={ 
    fruits: [ 
    { 
     "itemName": "banana", 
     "price": 1.00, 
     "quantityRemaining": 10 
    }, 
    { 
     "itemName": "apple", 
     "price": 2.00, 
     "quantityRemaining": 5 
    }, 
    { 
     "itemName": "raspberry", 
     "price": 5.00, 
     "quantityRemaining": 2 
    }, 
    { 
     "itemName": "kiwi", 
     "price": 3.00, 
     "quantityRemaining": 15 
    }, 
    { 
     "itemName": "pineapple, 
     "price": 7.00, 
     "quantityRemaining": 1 
    }, 
    { 
     "itemName": "strawberries", 
     "price": 2.00, 
     "quantityRemaining": 3 
    } 
    ] 
}, action){ 
    if(action.type === "DEDUCT"){ 
    return Object.assign({}, state, { 
     fruits: state.fruits.map((fruit, index) => { 
     action.payload.map((actionFruit) => { 
      if(fruit.itemName === actionFruit.itemName){ 
      let newQuantity = fruit.quantityRemaining - actionFruit.quantityRemaining; 
      return Object.assign({}, fruit, { 
       quantityRemaining: newQuantity 
      }); 
      } 
     }); 
     return fruit; 
     }) 
    }); 
    } 
    else 
    return state; 
} 

下面是我的調度員的一個例子(我創建了兩個做同樣的事情):

store.dispatch({type: "DEDUCT", payload: [ 
    { 
    "itemName": "banana", 
    "quantityRemaining": 1 
    }, 
    { 
    "itemName": "apple", 
    "quantityRemaining": 1 
    }, 
    { 
    "itemName": "strawberries", 
    "quantityRemaining": 1 
    } 
]}); 

回答

0

我看到的一個問題是,你實際上並沒有返回action.fruits.map()的結果。如果不使用大括號,則可以使用箭頭函數省略return關鍵字,但是一旦添加了curlies,就像正常情況一樣啓動了函數的主體,並且由您明確返回某些內容。

此外,作爲一個文體記,我建議定義爲減速機作爲一個獨立的變量的初始狀態:

const initialState = [ /* fruits here */]; 

const fruitReducer = (state = initialState, action) => { 
    // reducer logic here 
} 

它看起來像你的嵌套更新邏輯是正確的軌道上,但是您可能想要閱讀Redux文檔的Structuring Reducers - Immutable Update Patterns部分。

+0

那麼我會在'action.fruits.map()'的大括號之前返回'actionFruit'?我試過了,減速器還沒有更新狀態。 –

0

我發現這可以發生的方式你撰寫你的中間件。舉例來說,我以前有:

const store = createStore(
    rootReducer, 
    applyMiddleware(epicMiddleware), 
    composeEnhancers(applyMiddleware(...middleware)) 
) 

然而,卻彷彿雙重應用中間件做終極版脾氣暴躁,而且它不會趕上從rootReducer,只是epicMiddleware(這是一個奇特的東西新的狀態更新從副作用觸發動作/減速器)。

將我的epicMiddleware調入我的applyMiddleware(...middleware)來電解決了問題。也就是說,更新到以下工作:

const store = createStore(
    rootReducer, 
    composeEnhancers(applyMiddleware(...middleware)) // epicMiddleware is now in the `middleware` array 
) 

它可能不是你的問題,但它是一個東西,可能會導致你描述的症狀。

相關問題