Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@alexeyraspopov
Created March 7, 2019 11:50
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 alexeyraspopov/8b978ec41605a9d049b04e9b49eb9a20 to your computer and use it in GitHub Desktop.
Save alexeyraspopov/8b978ec41605a9d049b04e9b49eb9a20 to your computer and use it in GitHub Desktop.
function useRedux(selector = x => x, ...input) {
// достаем стор через контекст. возможно, понадобится реактовый, без react-redux
let store = useContext(ReduxContext);
// геттер для стейта с селектором. используется в нескольких местах ниже
let getState = () => selector(store.getState(), ...input);
// локальное состояние хука, содержит результат селектора от текущего состояния стора
let [state, setState] = useState(() => getState());
// выполняем тот же getState() каждый раз как стор обновляется
// если в setState() передавать то же самое что было раньше — ре-рендера не будет
useEffect(() => {
return store.subscribe(() => setState(getState()));
}, input);
// результат оборачиваем в тупл с диспатчем
return [state, store.dispatch];
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment