2016-11-14 101 views
0

我试图建立reactjs/Redux的一个购物车的应用程序,这是我的减速器1:如何计算减速机中所有物品的总价格?

const initialState = { 
    items: [], 
    cartOpen:true 
} 

    const Cart = (state = initialState, action) => { 
     switch (action.type) { 
      case 'ADD_TO_CART': 
       return [...state, action.payload] 
      default: 
       return state 
     } 
    } 

    export default Cart; 

其他减速器中包含的数据,即项目的应用:

const Data = (state = initialState, action) => { 
    switch (action.type) { 
     case 'GET_DATA_SUCCESS': 
      return Object.assign({}, state, { datas: action.data }); 
     case 'GET_DATA_FAIL': 
      return Object.assign({}, state, { datas: action.data }); 

     default: 
      return state 
    } 
} 

当ADD_TO_CART行动已发出我要计算购物车的新总计。我正在寻找一种方法来计算购物车更新时购物车中物品的总价格。

+0

我问你点什么?我刚接触'redux',但初始状态是一个'object',但为什么玩具会返回'array'呢? changin类型的reacin是什么? –

回答

0

你可以做这样的事情。

const initialState = { 
    items: [], 
    cartOpen:true, 
    total:0, 
} 

const Cart = (state = initialState, action) => { 
    switch (action.type) { 
     case 'ADD_TO_CART': 
      let newstate = [...state, action.payload]; 
      let newTotal = 0; 
      newstate.items.forEach(item=>{ 
       newTotal+=item.price; 
      }); 
      newstate.total =newTotal; 
      return newstate ; 
     default: 
      return state 
    } 
} 

export default Cart; 
+0

获得newTotal是NaN? –

+0

现在工作谢谢 –

0

如果导致项目变更是GET_DATA_SUCCESS,那么你可以计算出相同的减速机的总价格,并相应设置一个新的国有资产,所以像动作:

case 'GET_DATA_SUCCESS': 
    let totalPrice = getTotalPrice(action.data); 
    return Object.assign({}, state, { datas: action.data, cartTotal: totalPrice }); 

(如果价格能更改为检索失败,您需要重新计算价格并将其设置为两种情况下的子句。)

如果您不想在此子句中设置两个状态部分,则可以将其分解为两个减速器,两者都在(比如说)GET_DATA_SUCCESS上作用,但是设置了状态的不同部分(一个用于数据,一个用于cartTotal)。

作为一个完整的选择,铭记保持国家规范化的偏好;你可能只是离开项目的状态,并使用其他地方的帮手功能来计算渲染的总价格。如果项目数量相对较少且计算简单,那么这可能值得考虑。这是很值得一读:

http://redux.js.org/docs/recipes/ComputingDerivedData.html