Как организовать срезы в Redux Toolkit?

Я читал о том, как использовать createAsyncThunk, и увидел, что мои фрагменты плохо организованы.

У меня есть offer. Пользователи могут видеть все предложения, они также могут создать одно, просмотреть одно, иметь категории предложений и т. д.

Для меня один фрагмент был «тема/категория», например:

// Axios request to get all offers, post one, get categories offers, etc..

    const offerSlice = createSlice({
      name: 'offer',
      initialState: {
        allOffers: [],
        OtherOffers : [],
        oneOffers: {},
        categoriesOffers: []
      },
      reducers: {
        setAllOffers: (state, action) => {
          state.allOffers = action.payload;
        },
        setOneOffer: (state, action) => {
          state.oneOffers = action.payload;
        },
        setCategories: (state, action) => {
          state.categoriesOffers = action.payload;
        },
        otherOffers: (state, action) => {
          state.OtherOffers = action.payload;
        },
      },
    });

Итак, знайте, я читал какой-то пост StackOverflow и увидел, что один фрагмент больше похож на «одну тему».

Например, здесь лучше иметь один фрагмент для одного предложения, один для всех предложений, один для категорий...

Итак, я потерян. Как правильно использовать фрагмент из redux-toolkit?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
2
0
177
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Обычно рекомендуется иметь отдельные срезы для разных частей штата, особенно если эти разные части имеют разные проблемы или если они обновляются разными действиями. Наличие отдельных срезов для разных частей состояния может помочь сделать код более организованным и понятным. В этом случае иметь один фрагмент для oneOffer, другой для allOffers и один для categories будет иметь смысл, поскольку они имеют разную структуру данных и обновляются разными действиями. Таким образом, вы можете сохранить состояние и редукторы, которые манипулируют этим состоянием, организованными и простыми для понимания.

// oneOffer slice
const oneOfferSlice = createSlice({
  name: 'oneOffer',
  initialState: {},
  reducers: {
    setOneOffer: (state, action) => {
      state = action.payload;
    }
  }
});

// allOffers slice
const allOffersSlice = createSlice({
  name: 'allOffers',
  initialState: [],
  reducers: {
    setAllOffers: (state, action) => {
      state = action.payload;
    }
  }
});

// categories slice
const categoriesSlice = createSlice({
  name: 'categories',
  initialState: [],
  reducers: {
    setCategories: (state, action) => {
      state = action.payload;
    }
  }
});

В этом примере каждый слайс имеет уникальное имя, начальное состояние и одну функцию-редуктор, которую можно использовать для обновления его состояния. Фрагмент oneOffer имеет начальное состояние {} и действие setOneOffer, которое обновляет состояние с помощью полезной нагрузки. Срез allOffers имеет начальное состояние [] и действие setAllOffers, которое обновляет состояние с помощью полезной нагрузки. Наконец, срез категорий имеет начальное состояние [] и действие setCategories, которое обновляет состояние с помощью полезной нагрузки.

Затем вам нужно будет объединить эти фрагменты с помощью функции createAsyncThunk или каким-либо другим способом передать данные из вызовов API в состояния.

Хорошо, это то, о чем я думал! Спасибо за ваш ответ

Elodie Muller 16.01.2023 10:45

На самом деле, здесь нет правильного способа использовать ваш слайс. Оба метода в порядке. Все зависит от того, как ВЫ хотите его организовать и как вы будете получать к нему доступ в своем приложении. Но что более важно, при написании простого в обслуживании приложения.

Я лично разделяю фрагменты в зависимости от базы данных. Например, если у меня есть таблица user и offer, я создам 2 среза.

Для вашего примера я бы объединил свои редукторы следующим образом:

const reducer = combineReducers({
  offers: offers.reducer,
  categories: categories.reducer,
})

Затем я могу создать const offers = useSelector... и const categories = useSelector...

С помощью этого метода вы можете легко писать поддерживаемый и легко читаемый код.

Согласно документации Redux,

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

Надеюсь, мой совет поможет.

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

import { createSlice } from '@reduxjs/toolkit';

export const initialState = {
  loading: false,
  userInfo: {
    email: '',
    password: '',
    challengeName: '',
    code: '',
    firstName:"Guest"
  },
  userRoles: {},
  error: '',
};

const loginSlice = createSlice({
  name: 'login',
  initialState,
  reducers: {
    loginLoading: (state, action) => {
      if (action.payload !== undefined) {
        state.loading = action.payload;
      } else {
        state.loading = true;
      }
    },
    loginError: (state, action) => {
      state.error = action.payload;
    },
    loginUserInfo: (state, action) => {
      state.loading = false;
      state.userInfo = action.payload;
    },
    loginReset: (state) => {
      state.userInfo = initialState.userInfo;
      state.error = initialState.error;
    },
    SetUserRoles: (state, action) => {
      state.userRoles = action.payload;
    }
  },
});

const { actions, reducer } = loginSlice;
export const {
  loginLoading, loginError,
  loginUserInfo, loginReset, SetUserRoles
} = actions;
export default reducer;

Другие вопросы по теме