Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Calling an action from a different reducer with React and redux

Tags:

I got 2 components; A market and a status. The status component manage the amount of money the user have and the market have buttons to buy some stuff. When i click on the button (in the market component), i want my money to decrement.

How can i achieve this the best way possible?

This is my App component who has the Market and Status:

import React from 'react';
import { Link } from 'react-router';
import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';
import * as MarketActions from '../actions/market-actions';
import * as StatusActions from '../actions/status-actions';

import Market from './Market.react';
import Status from './Status.react';

export default class App extends React.Component {
  render() {
    const { dispatch, market, status } = this.props;

    return (
      <div>
        <h1>App</h1>
        <Link to='/'>App</Link>{' '}<Link to='/home'>Home</Link>
        <Status status={status} {...bindActionCreators(StatusActions, dispatch)} />
        <Market market={market} {...bindActionCreators(MarketActions, dispatch)} {...bindActionCreators(StatusActions, dispatch)} />
        {this.props.children}
      </div>
    );
  }
}

export default connect(state => ({ market: state.market, status: state.status }))(App);

I bound the actions from the status on the market component (i feel it's not the right thing to do, but it worked).

After this, i handle these actions in the Market component on a click of a button like this:

handleBuyClick(e) {
  let { index, price } = e.target.dataset;
  index = parseInt(index);
  price = parseInt(price);

  this.props.buyItem(index);
  this.props.changeMoney(price); //this bugs me, i think it don't belongs there
}

Is there a better way?

Thank you

like image 946
Mike Boutin Avatar asked Sep 30 '15 20:09

Mike Boutin


People also ask

Can we call action from reducer?

Dispatching an action within a reducer is an anti-pattern. Your reducer should be without side effects, simply digesting the action payload and returning a new state object. Adding listeners and dispatching actions within the reducer can lead to chained actions and other side effects.

How do you connect action and reducer in react?

When you dispatch an action creator it passes the action object to the root reducer. The action object is passed through the entire state tree and any reducers that process the action type consume it.

How do you call multiple reducers in Redux?

To manage the multiple reducers we have function called combineReducers in the redux. This basically helps to combine multiple reducers into a single unit and use them. Example: Let's make a simple book list application with help of redux to understand to combine multiple reducers.

Does Redux call all reducers?

One frequently asked question is whether Redux "calls all reducers" when dispatching an action. Since there really is only one root reducer function, the default answer is "no, it does not".


1 Answers

Why not react on the same action in both reducers? You could have code like this:

function status(state, action){
...
    switch(action.type){
        case BUY_ITEM: {
            return 'bought'
        }
    }
...
}

function market(state, action){
...
    switch(action.type){
        case BUY_ITEM: {
            return {...state, action.itemId : state[action.itemId] - 1 }
        }
    }
...
}

With whatever "reaction code" you need to perform.

like image 139
Victor Suzdalev Avatar answered Oct 18 '22 23:10

Victor Suzdalev