Обновить другой фрагмент после запроса

avatar
Bishonen_PL
8 августа 2021 в 18:33
1148
1
2

используя запрос RTK, как можно использовать функцию выборки для обновления другого состояния другого слайса?

По сути, я пытаюсь расположить все связанные состояния рядом друг с другом, поэтому после запроса данных с помощью useLazyGetQuery я хотел бы использовать результат и сохранить его в существующем состоянии срезов.

Несмотря на то, что что-то вроде приведенного ниже работает из компонента, это делает весь код беспорядочным

  const [trigger, result, lastArg] = useLazyGetFiltersQuery();

  React.useEffect(() => {
    if (result.status === 'fulfilled' && result.isSuccess === true && result.isLoading === false) {
      dispatch(updateData(result.data.map((pg) => ({ label: pg, value: pg }))));
    }
  }, [dispatch, result, result.isLoading, result.isSuccess, result.status]);

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

Спасибо

Источник

Ответы (1)

avatar
phry
8 августа 2021 в 20:01
3

Вообще, я бы посоветовал не копировать данные из RTK-Query, если только у вас нет веской причины: вам придется писать вручную много материала, что в значительной степени противоречит цели RTK-Query, и вы потеряете такие вещи, как автоматический сбор неиспользуемых записей кэша - с этого момента вы должны делать это самостоятельно.
Кроме того, эти данные уже есть в Redux. Обычно не следует дублировать данные в хранилище, если этого можно избежать.

Тем не менее, конечно, вы можете это сделать. Например, это показано в примере проверки подлинности «Использование extraReducers»:

const slice = createSlice({
  name: 'auth',
  initialState: { user: null, token: null } as AuthState,
  reducers: {},
  extraReducers: (builder) => {
    builder.addMatcher(
      api.endpoints.login.matchFulfilled,
      (state, { payload }) => {
        state.token = payload.token
        state.user = payload.user
      }
    )
  },
})

Имейте в виду: это Redux, и все происходит через действия. Вам никогда не придется useEffect что-то записывать обратно в состояние. Просто следите за правильными действиями ваших редукторов.

TKforce
1 декабря 2021 в 08:03
0

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

phry
1 декабря 2021 в 09:27
0

@TKforce Theat сделает промежуточное программное обеспечение бесполезным, поскольку оно довольно сильно зависит от этого состояния. Таким образом, в конце концов у вас останутся только преобразователи для выборки данных и т.д., даже им могут понадобиться некоторые из этих данных редуктора. Но даже если бы это работало, вы бы отключили около 90% RTK-Query.