Является ли плохой практикой выбирать весь фрагмент в redux?

#reactjs #redux #react-redux #react-hooks

Вопрос:

Я хочу выбрать весь фрагмент в redux, как показано ниже:

 interface AuthState {
  user?: User;
  shouldShowLogin: boolean;
}

export const authSlice = createSlice({
  name: 'auth',
  initialState,
  reducers: {
    setUser: ...,
    showLogin: ...,
    hideLogin: ...,
  },
});

export const useAuth = () => useSelector((state) => state.auth);
 

Так что я мог бы сделать что-то вроде const { user, shouldShowLogin } = useAuth(); в компонентах. Это удобнее в большинстве случаев, но я не уверен, что это плохая практика/неэффективно.

Я хочу сделать что-то подобное для отправки (т. Е. Абстрагироваться от useDispatch()). Может быть, что-то вроде const setUserWithDispatch = (info) => useDispatch()(info); того, что я могу сделать просто setUserWithDispatch(userInfo) в своих компонентах, без необходимости делать useDispatch() и потом dispatch(setUser(userInfo)) .

В идеале я бы хотел это сделать const { user, shouldShowLogin, setUser, showLogin, hideLogin } = useAuth(); , но я не уверен, как это сделать. Опять же, является ли это плохой практикой/неэффективной? Почему redux не настраивает это автоматически?

Ответ №1:

Компонент будет повторно отправлен, когда значение, выбранное из useSelector изменений. Следовательно, обычно требуется выбрать минимальный объем информации, необходимый для минимизации повторных отправлений.

Если существует несколько свойств, state.auth и вас интересует только одно, то недостатком этого подхода к деструктуризации является то, что он приведет к повторному запуску компонента при изменении других свойств объекта. В вашем примере вы, похоже, используете все свойства, так что это не должно иметь значения.

Я думаю, вам будет трудно сделать что-то на заказ, dispatch не нарушая правил крючков. Крючки не могут быть вызваны условно и должны вызываться на верхнем уровне компонента. Вы не можете вызвать useDispatch (или пользовательский хук, который его использует) внутри обратного вызова обработчика событий, внутри useEffect функции и т. Д.

Текущая реализация useDispatch крючка означает, что вы вызываете useDispatch один раз для каждого компонента, чтобы получить доступ к dispatch функции для текущего хранилища на основе контекста react-redux. Возвращаемая dispatch функция является чистой функцией (не крючком) и может использоваться в любом месте.

Вы можете использовать redux bindActionCreators для привязки действий к отправке для конкретного экземпляра хранилища. Это похоже на то, что вы пытаетесь сделать, но это не рекомендуется. Недостатком является то, что вы создаете ненужную связь между действиями и конкретным экземпляром хранилища. Вы потеряете возможность использовать другой экземпляр хранилища для тестирования.