2016-09-30 2 views
1

웹샵을 구축 중이며 몇 가지 문제가 있습니다. 내가 원하는 구매 버튼을 클릭하면 세 가지 일이 :하나의 동작으로 두 곳에서 redux 상태를 업데이트하십시오.

  • 가 REDUX 상태로 제품을 추가 (shoppingcartReducer)
  • 업데이트를
  • 밖으로 렌더 REDUX 상태에서 합계 수량 (shoppingcartReducer를) 내 shoppingCart.js의 합계 및 수량 구성 요소

문제는 shoppingcartReducer에 있습니다. 하나의 작업에서 두 ​​가지 다른 경로로 상태를 업데이트하는 방법을 모릅니다.

return state 
      .setIn(['products', action.articleNr], addArticle(action, state)) 

여기서 나는 '제품/articleNr'경로와 조작 데이터,하지만 나는 또한의 합계 수량을 업데이트하려고합니다 './'.

내가 생각한 대안은 shoppingcartAction에서 일종의 미들웨어를 사용하는 것일 수도 있지만,이게 옳은지 또는 어떻게해야하는지 정말 모르겠다!

감사합니다. 감사합니다.


shoppingcartReducer :

import Immutable from 'seamless-immutable' 

import { addToShoppingcart, createShoppingCart } from '../actions/shoppingcartActions' 

const ADD_TO_SHOPPINGCART = 'ADD_TO_SHOPPINGCART' 
const CREATE_SHOPPING_CART = 'CREATE_SHOPPING_CART' 

const initialState = Immutable({ 
    sum: 0, 
    quantity: 0 
}) 

export default function shoppingcartReducer(state = initialState, action) { 
    switch (action.type) { 
    case ADD_TO_SHOPPINGCART: 
     return state 
     .setIn(['products', action.articleNr], addArticle(action, state)) 

    case CREATE_SHOPPING_CART: 
     return state 
     .set(action.id, createCart(action)) 
    } 
    return state 
} 

function addArticle(action, state) { 
    return { 
    product: action.product 
    } 
} 

function createCart(action) { 
    return { 
    id: action.id, 
    } 
} 

shoppingcartActions :

let nextTodoId = 0 

const ADD_TO_SHOPPINGCART = 'ADD_TO_SHOPPINGCART' 
const CREATE_SHOPPING_CART = 'CREATE_SHOPPING_CART' 

export function addToShoppingcart(product) { 
    return { 
    type: ADD_TO_SHOPPINGCART, 
    articleNr: product.articleNr, 
    product: product, 
    } 
} 

export function createShoppingCart() { 
    return { 
    type: CREATE_SHOPPING_CART, 
    id: 'productNr:'+nextTodoId++, 
    } 
} 

ShoppingCart.js :

import React, { Component } from 'react' 

import { bindActionCreators } from 'redux' 
import { connect } from 'react-redux' 
import * as shoppingcartActions from '../../actions/shoppingcartActions' 

class ShoppingCart extends Component { 

    componentWillMount() { 
    this.state = { 
     shoppingcartReducer: [] 
    } 
    } 

    componentWillReceiveProps(nextProps) { 
    this.setState({ 
     shoppingcartReducer: nextProps.shoppingcartReducer ? nextProps.shoppingcartReducer : '' 
    }) 
    } 

    render() { 
    const { shoppingcartReducer } = this.props 
    const { sum, quantity } = shoppingcartReducer 

    return (
     <div className="shoppingCart"> 
      <ul> 
      <li>Summa: {sum} :-</li> 
      <li>Antal varor: {quantity}</li> 
      </ul> 
     </div> 
    ) 
    } 
} 

function mapStateToProps(state) { 
    return { 
    shoppingcartReducer: state.shoppingcartReducer 
    } 
} 

function mapDispatchToProps(dispatch) { 
    return bindActionCreators(shoppingcartActions, dispatch) 
} 

export default connect(mapStateToProps, mapDispatchToProps)(ShoppingCart) 
+2

하나의 동작으로 인해 다중 상태가 변경되는 것은 매우 쉽습니다. 동일한 동작을 처리하는 여러 개의 감속기를 사용하기 만하면됩니다. ['combinedReducers'] (http://redux.js.org/docs/api/combineReducers.html)를 사용합니까? –

+0

복수 감속기가 작동했습니다. 감사합니다! – AlfredO

답변

0

이것은 효과가 있습니다.

관련 문제