Add reducer to the store when component mount and remove reducer from the store when component unmount
For more information read this article: Put a Soul into a React-Redux Project
Example with hook useReducer :
const Container = () => {
const { dispatch, useReducer } = useStore()
useReducer('books', booksReducer)
return <button onClick={() => dispatch({ space: 'book', type: 'ADD_BOOK' })} >
add book
</button>
}
Modules 'react' and 'redux' should be installed.
Run NPM command:
npm i @simprl/dynamic-reducer
Or yarn:
yarn add @simprl/dynamic-reducer
import { createStore } from 'redux';
import { reducer as dynamicReducer } from '@simprl/dynamic-reducer';
const { reducer, addReducer } = dynamicReducer()
const store = createStore(reducer)
const exStore = {
...store,
useReducer: (name, reducer) => {
useEffect(
() => addReducer(name, reducer, store.dispatch),
[ name, reducer ]
);
},
}
If your project has static reducers, you can keep they and add the dynamic reducer to the store with static reducers:
import { createStore, combineReducers } from 'redux';
import { reducer as createDynamicReducer } from '@simprl/dynamic-reducer';
import reducer1 from './ducks/reducer1';
import reducer2 from './ducks/reducer2';
const { reducer: dynamic, addReducer } = createDynamicReducer()
const store = createStore(combineReducers({
reducer1,
reducer2,
dynamic,
}))
const exStore = {
...store,
useReducer: (name, reducer) => {
useEffect(
() => addReducer(name, reducer, store.dispatch),
[ name, reducer ]
);
},
}
You can use Provider from 'react-redux' or create your own context
const App = () => {
return <Provider store={exStore} >
<Container />
</Provider>
}
const { dispatch, useReducer } = useStore()
useReducer('books', booksReducer)