React higher order component to provide UI state for components.
npm install react-redux-ui-state```
npm i react-redux-ui-state -S
``
yarn add react-redux-ui-state
* Make it easy to have component state in Redux
* Make it possible to have "internal" state with or without using classes
* Reduce Redux boilerplate for properties like UI flags
* Easily allow multiple instances of the same component to get their own unique
state
* Get the benefits of Redux without most of the work for UI state
* Create a config object with an optional name property and a function (which
gets passed props) which returns a state object consisting of your initial
state.
* Wrap your component in the HOC.
* An action gets dispatched like UI_STATE_ADD:some-component_ oncomponentWillMount
uiState
* The initial state gets added to a slice of the store with thesetUiState
name/state.
* Call with a new state object.UI_STATE_SET:some-component_
* An action gets dispatched like componentWillUnmount
* Component state gets removed from store on (optional)
setUiState: Simple update function that accepts an object that will be shallow
merged with current state. Accepts an optional callback called with the state
change.
resetUiState: Function to reset component to initial state. Accepts an
optional callback called with the initial state.
#### name {String | Function}
If a string is provided a uuid will be suffixed in order not to overwrite the
state in the store. Providing a function gives you the ability to create your
own unique name, with the ability to use the component's props, e.g:
`jsMyComponent__${props.className}
const uiStateConfig = {
...
name: props => ,`
...
};
#### state {Function}
Extend the wrapper component's props, e.g.
`js`
const uiStateConfig = {
...
state: (props) => ({
uiProp: 'uiProp',
uiActive: props.active,
}),
...
};
#### persist {Boolean}
Defaults to false. If true the component's state will not be removed fromuiState
the domain.
`js`
const uiStateConfig = {
...
persist: true,
...
};
`javascript
// rootReducer.js
import { combineReducers } from 'redux';
import { uiStateReducer } from 'react-redux-ui-state';
export default function createRootReducer (reducers) {
return combineReducers({
...reducers,
uiState: uiStateReducer,
});
}
// someComponent.js
import React from 'react';
import { uiState } from 'react-redux-ui-state';
export function someComponent ({
someUiFlag,
somePassedThing,
resetUiState,
setUiState,
uiStateName,
}) {
return (
onClick={() =>
resetUiState(resetState => console.log(resetState))}
>
reset state
);
}
const uiStateConfig = {
name: 'some-component',
persist: true, // optional
state: (props) => ({
someUiFlag: false,
somePassedThing: props.x ? props.x : null;
}),
};
export default uiState(uiStateConfig)(someComponent);
`
There is a simple example app made with create-react-app in the ./examplecd
folder. Simple into that directory, yarn install && yarn start. You canApp.js
edit the file to add more instances of the Button and Text`
components.
Feel free to open a PR!