Можно ли отправлять действие среза из другого действия в redux-toolkit?

Я использую redux-toolkit и имею 2 фрагмента: auth и profile

auth = ›обрабатывать информацию о токене
profile =› обрабатывать информацию об учетной записи пользователя

Когда пользователь пытается войти в систему, я отправляю запрос в api, который возвращает мне токен пользователя и информацию об учетной записи. Тогда мне нужно сохранить эту информацию. Я помещаю токен в соответствующее поле (в том же срезе). И мне нужно поместить информацию о моей учетной записи в срез профиля (обработка входа в систему происходит в срезе аутентификации). Теперь я просто отправляю действие setProfile из среза auth.

Это анти-шаблон для отправки действия профиля из среза аутентификации? Или мне нужно перенести эту логику из редукции в компонент? Или выполнить вход в систему за пределами среза? Или мне нужно хранить все в одном куске?

// PROFILE SLICE | profile.js 

const initialState = {
  data: {},
  status: 'idle'
}

export const profileSlice = createSlice({
  name: 'profile',
  initialState,
  reducers: {
    setProfile(s, {payload: profile}) {
      s.profile = profile
    }
  }
})

export const {setProfile} = userSlice.actions;
export default profileSlice.reducer


// AUTH SLICE | auth.js

import {setProfile} from './profile' // import action creator from profile slice

const initialState = {
  token: null,
  status: 'idle'
}

export const authSlice = createSlice({
  name: 'auth',
  initialState,
  reducers: {
    setToken(s, {payload: token}) {
      s.token = token
    }
  }
})

export const login = ({email, password}) => dispatch => {
  return api.auth.login({
    email,
    password
  })
    .then(res => {
      const {token, ...profile} = res.data
      dispatch(setToken(token))
      dispatch(setProfile(profile)
    })
}

export const {setToken} = authSlice.actions;
export default authSlice.reducer


person eugenedrvnk    schedule 21.04.2021    source источник
comment
у вас есть несколько вариантов. - отправьте другое действие от вашего обработчика успеха. или вы можете написать промежуточное ПО (или использовать какое-то) для наблюдения за действиями и отправки другого, если выполняется ваше успешное действие аутентификации.   -  person webduvet    schedule 23.04.2021


Ответы (1)


Вы не можете отправлять действия внутри фрагмента / редуктора, хотя вы, безусловно, можете отправлять действия из преобразователя, где бы он ни был написан.

Однако вы можете прослушивать действия другого среза в любом другом редьюсере, и на самом деле мы поощряем этот шаблон:

При этом нужно помнить о том, что если два разных фрагмента зависят друг от друга, вы можете столкнуться с проблемой циклической зависимости импорта, и в этом случае вам нужно извлечь некоторые общие функции, чтобы прервать цикл импорта:

https://redux-toolkit.js.org/usage/usage-guide#exporting-and-using-slices

В этом конкретном случае я вижу, что вы фактически отделяете значение token от остальных данных. Я бы предложил отправить одиночное действие, которое содержит все полученные данные для входа, и позволить обоим редукторам срезов выбирать те части, которые им важны.

person markerikson    schedule 21.04.2021
comment
Но где мне разместить это действие? Создать кусок для общих действий? - person eugenedrvnk; 22.04.2021
comment
Или мне нужно поместить какой-нибудь преобразователь в корневой редуктор, назвать его логином и оттуда отправлять действия из редукторов авторизации и профиля? - person eugenedrvnk; 22.04.2021
comment
Еще раз извините, у меня просто небольшой опыт работы с redux, у меня есть еще один вариант. Возможно, я смогу отправить thunk в корневом редукторе (dispatch (initUser)). А затем в этом преобразователе отправьте действие (dispatch (userInited)) со всей необходимой информацией. А из редукторов auth и profile я должен это действие слушать? Это правильно? мне этот вариант кажется наиболее удобным - person eugenedrvnk; 22.04.2021