В качестве альтернативы вы можете использовать встроенные функции React, такие как ContextAPI и ReactHoocks, для создания собственной глобальной системы управления состоянием.
- Создайте своего провайдера
import React, {createContext, useContext, useReducer} from 'react';
export const StateContext = createContext();
export const StateProvider = ({reducer, initialState, children}) =>(
<StateContext.Provider value={useReducer(reducer, initialState)}>
{children}
</StateContext.Provider>
);
export const useStateValue = () => useContext(StateContext);
Потребитель позволяет получить доступ к значению в любом компоненте вашего приложения
import { StateProvider } from '../state';
const App = () => {
const initialState = {
theme: { primary: 'green' }
};
const reducer = (state, action) => {
switch (action.type) {
case 'changeTheme':
return {
...state,
theme: action.newTheme
};
default:
return state;
}
};
return (
<StateProvider initialState={initialState} reducer={reducer}>
// App content ...
</StateProvider>
);
}
Использование внутри компонента:
import React, { Component } from 'react';
import { StateContext } from './state';
class ThemedButton extends Component {
static contextType = StateContext;
render() {
const [{ theme }, dispatch] = this.context;
return (
<Button
primaryColor={theme.primary}
onClick={() => dispatch({
type: 'changeTheme',
newTheme: { primary: 'blue'}
})}
>
Make me blue!
</Button>
);
}
}
Для лучшего понимания см. Управление состоянием с помощью React Hooks и Context API в 10 строках кода!