useSelector
и useDispatch
— это хуки (hooks), предоставляемые библиотекой react-redux
для работы с Redux-сторе (хранилищем) в функциональных компонентах.
Этот хук позволяет извлекать (select) данные из Redux-стора. Он принимает функцию-селектор и возвращает выбранные данные.
const result = useSelector(selectorFn, equalityFn?)
===
).import { useSelector } from 'react-redux';
const CounterComponent = () => {
const count = useSelector(state => state.counter.value);
return <div>{count}</div>;
};
reselect
.Этот хук возвращает ссылку на dispatch
-функцию Redux-стора, чтобы отправлять действия (actions).
const dispatch = useDispatch();
import { useDispatch } from 'react-redux';
import { increment } from './counterSlice';
const ButtonComponent = () => {
const dispatch = useDispatch();
return <button onClick={() => dispatch(increment())}>+</button>;
};
dispatch
передаётся в дочерние компоненты, оберните колбэк в useCallback
.
const handleClick = useCallback(() => dispatch(increment()), [dispatch]);
dispatch
в цикле или условиях без необходимости.import { useSelector, useDispatch } from 'react-redux';
import { decrement } from './counterSlice';
const Counter = () => {
const count = useSelector(state => state.counter.value);
const dispatch = useDispatch();
return (
<div>
<span>{count}</span>
<button onClick={() => dispatch(decrement())}>-</button>
</div>
);
};
const item = useSelector(state => state.items.byId[id], [id]);
shallowEqual
:
import { shallowEqual } from 'react-redux';
const data = useSelector(state => ({ a: state.a, b: state.b }), shallowEqual);
Создание объектов в селекторе:
❌ Плохо: useSelector(state => ({ value: state.value }))
(новый объект при каждом вызове).
✅ Хорошо: Выбирайте отдельные значения.
Избыточные диспатчи: Не вызывайте dispatch
синхронно после другого dispatch
.
useSelector
— для чтения данных из стора с подпиской на изменения.useDispatch
— для отправки действий.memo
, useCallback
и shallowEqual
.