Last active
March 21, 2018 02:45
-
-
Save luaysuarna/390c8551ed8fb8e14601e35390daff73 to your computer and use it in GitHub Desktop.
Changing from React Redux - React Redux Saga
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// Source: https://blog.logrocket.com/understanding-redux-saga-from-action-creators-to-sagas-2587298b5e71 | |
// | |
// ------------------------------- | |
// React Redux Plain | |
// ------------------------------- | |
const {Provider, connect} = ReactRedux; | |
const createStore = Redux.createStore | |
// Reducer | |
const initialState = { | |
url: '', | |
loading: false, | |
error: false, | |
}; | |
const reducer = (state = initialState, action) => { | |
switch (action.type) { | |
case 'REQUESTED_DOG': | |
return { | |
url: '', | |
loading: true, | |
error: false, | |
}; | |
case 'REQUESTED_DOG_SUCCEEDED': | |
return { | |
url: action.url, | |
loading: false, | |
error: false, | |
}; | |
case 'REQUESTED_DOG_FAILED': | |
return { | |
url: '', | |
loading: false, | |
error: true, | |
}; | |
default: | |
return state; | |
} | |
}; | |
// Action Creators | |
const requestDog = () => { | |
return { type: 'REQUESTED_DOG' } | |
}; | |
const requestDogSuccess = (data) => { | |
return { type: 'REQUESTED_DOG_SUCCEEDED', url: data.message } | |
}; | |
const requestDogaError = () => { | |
return { type: 'REQUESTED_DOG_FAILED' } | |
}; | |
const fetchDog = (dispatch) => { | |
dispatch(requestDog()); | |
return fetch('https://dog.ceo/api/breeds/image/random') | |
.then(res => res.json()) | |
.then( | |
data => dispatch(requestDogSuccess(data)), | |
err => dispatch(requestDogError()) | |
); | |
}; | |
// Component | |
class App extends React.Component { | |
render () { | |
return ( | |
<div> | |
<button onClick={() => fetchDog(this.props.dispatch)}>Show Dog</button> | |
{this.props.loading | |
? <p>Loading...</p> | |
: this.props.error | |
? <p>Error, try again</p> | |
: <p><img src={this.props.url}/></p>} | |
</div> | |
) | |
} | |
} | |
// Store | |
const store = createStore(reducer); | |
const ConnectedApp = connect((state) => { | |
console.log(state); | |
return state; | |
})(App); | |
// Container component | |
ReactDOM.render( | |
<Provider store={store}> | |
<ConnectedApp /> | |
</Provider>, | |
document.getElementById('root') | |
); | |
// ------------------------------- | |
// React Redux Saga | |
// ------------------------------- | |
const {Provider, connect} = ReactRedux; | |
const {createStore, applyMiddleware} = Redux; | |
const createSagaMiddleware = ReduxSaga.default; | |
const {takeEvery} = ReduxSaga; | |
const {put, call} = ReduxSaga.effects; | |
// Reducer | |
const initialState = { | |
url: '', | |
loading: false, | |
error: false, | |
}; | |
const reducer = (state = initialState, action) => { | |
switch (action.type) { | |
case 'REQUESTED_DOG': | |
return { | |
url: '', | |
loading: true, | |
error: false, | |
}; | |
case 'REQUESTED_DOG_SUCCEEDED': | |
return { | |
url: action.url, | |
loading: false, | |
error: false, | |
}; | |
case 'REQUESTED_DOG_FAILED': | |
return { | |
url: '', | |
loading: false, | |
error: true, | |
}; | |
default: | |
return state; | |
} | |
}; | |
// Action Creators | |
const requestDog = () => { | |
return { type: 'REQUESTED_DOG' } | |
}; | |
const requestDogSuccess = (data) => { | |
return { type: 'REQUESTED_DOG_SUCCEEDED', url: data.message } | |
}; | |
const requestDogError = () => { | |
return { type: 'REQUESTED_DOG_FAILED' } | |
}; | |
const fetchDog = () => { | |
return { type: 'FETCHED_DOG' } | |
}; | |
// Sagas | |
function* watchFetchDog() { | |
yield takeEvery('FETCHED_DOG', fetchDogAsync); | |
} | |
function* fetchDogAsync() { | |
try { | |
yield put(requestDog()); | |
const data = yield call(() => { | |
return fetch('https://dog.ceo/api/breeds/image/random') | |
.then(res => res.json()) | |
} | |
); | |
yield put(requestDogSuccess(data)); | |
} catch (error) { | |
yield put(requestDogError()); | |
} | |
} | |
// Component | |
class App extends React.Component { | |
render () { | |
return ( | |
<div> | |
<button onClick={() => this.props.dispatch(fetchDog())}>Show Dog</button> | |
{this.props.loading | |
? <p>Loading...</p> | |
: this.props.error | |
? <p>Error, try again</p> | |
: <p><img src={this.props.url}/></p>} | |
</div> | |
) | |
} | |
} | |
// Store | |
const sagaMiddleware = createSagaMiddleware(); | |
const store = createStore( | |
reducer, | |
applyMiddleware(sagaMiddleware) | |
); | |
sagaMiddleware.run(watchFetchDog); | |
const ConnectedApp = connect((state) => { | |
console.log(state); | |
return state; | |
})(App); | |
// Container component | |
ReactDOM.render( | |
<Provider store={store}> | |
<ConnectedApp /> | |
</Provider>, | |
document.getElementById('root') | |
); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment