Skip to content

Instantly share code, notes, and snippets.

@alaboudi
Last active November 29, 2018 13:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save alaboudi/421b211c0597b34cac1eb3e6803a1714 to your computer and use it in GitHub Desktop.
Save alaboudi/421b211c0597b34cac1eb3e6803a1714 to your computer and use it in GitHub Desktop.
Imperative Action Type
// scoreboard-reducer.js
const INITIAL_STATE = {
home: 0,
away: 0,
}
export const scoreboardReducer = (state = INITIAL_STATE, action) {
switch (action.type) {
case 'INCREMENT_HOME_SCORE':
return {...state, home: state.home + 1 };
case 'INCREMENT_AWAY_SCORE':
return {...state, away: state.away + 1 };
default:
return state;
}
}
// audience-reducer.js
const INITIAL_STATE = 0; // represents audience excitement;
export const audienceExcitementReducer = (state = INITIAL_STATE, action) {
switch (action.type) {
case 'INCREASE_AUDIENCE_EXCITEMENT':
return state + 1; // audience gets more excited
default:
return state;
}
}
// coupling in some container component.js
export class Game extends React.Component {
....
onHomeGoal() {
this.props.dispatch({type: 'INCREMENT_HOME_SCORE'});
this.props.dispatch({type: 'INCREASE_AUDIENCE_EXCITEMENT'});
}
onAwayGoal() {
this.props.dispatch({type: 'INCREMENT_AWAY_SCORE'});
this.props.dispatch({type: 'INCREASE_AUDIENCE_EXCITEMENT'});
}
}
// Another version of this implementation
// scoreboard-reducer.js
const INITIAL_STATE = {
home: 0,
away: 0,
}
export const scoreboardReducer = (state = INITIAL_STATE, action) {
switch (action.type) {
case 'INCREMENT_HOME_SCORE':
return {...state, home: state.home + 1 };
case 'INCREMENT_AWAY_SCORE':
return {...state, away: state.away + 1 };
default:
return state;
}
}
// audience-reducer.js
const INITIAL_STATE = 0; // represents audience excitement;
export const audienceExcitementReducer = (state = INITIAL_STATE, action) {
switch (action.type) {
case 'INCREASE_AUDIENCE_EXCITEMENT':
return state + 1; // audience gets more excited
default:
return state;
}
}
export class Game extends React.Component {
....
onHomeGoal() {
this.props.dispatch({type: 'INCREMENT_HOME_SCORE'});
}
onAwayGoal() {
this.props.dispatch({type: 'INCREMENT_AWAY_SCORE'});
}
}
// coupling in side-effect-handler.js (using redux-saga)
export function* watchIncrementHomeScore() {
yield takeEvery(['INCREMENT_HOME_SCORE','INCREMENT_AWAY_SCORE'], updateAudienceExcitement);
}
export function* updateAudienceExcitement() {
yield put({ type: 'INCREASE_AUDIENCE_EXCITEMENT'});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment