redux-toolkit 在另一个 thunk reducer 的同一切片中使用 actionCreater

标签 redux redux-thunk redux-toolkit

我有一个使用 redux-toolkit 中的 createSlice 生成的 redux-thunk reducer ,名为 getOne

getOne 从 API 获取并调度加载状态的操作,(startedLoadingfinishedLoadingerrorLoading )。

我还想使用结果数据调用在同一切片中创建的另一个名为 insert 的 actionCreater。或者直接从 getOne reducer 更新状态。

import { createSlice } from "@reduxjs/toolkit"
import { startedLoading, finishedLoading, errorLoading } from '../slices/loadingSlice'
const apiEndpoint = "/api/v1"
const fetchOptions = { headers: { "Content-Type": "application/json" } }

const createModelSlice = function (modelName) {
  return createSlice({
    name: modelName,
    initialState: {byId: {}},
    reducers: {
      insert: (state, action) => {
        // ...
      },
      getOne: (state, action) => async (dispatch) => {
        // ...
        try {
          const response = await fetch(/*  */)

          // How would I update the store here?

          // 1. reference the insert actionCreater somehow.
          dispatch(insert({id: id, data: response))

          // 2. construct the action manually
          dispatch({action: `${modelName}/insert`, payload: {id: id, data: response))

          // 3. Mutate the state here and rely immer. (I'm not sure exactly how that works)
          state[modelName].byId[id] = response

          dispatch(finishedLoading({ key: /* */ }))
        } catch (error) {
          dispatch(errorLoading({ key: /* */ }))
        }
      },
      // ...
    }
  })
}

最佳答案

我错过了文档中关于切片无法使用 thunk 的部分。无论哪种方式,它都不起作用,因为 thunk 操作不会映射到 reducer ,而是将其他操作分派(dispatch)给多个其他 reducer /操作。

创建切片后,我将 thunk 操作添加到切片操作中。这样我就可以引用其他操作


import { createSlice } from "@reduxjs/toolkit"
const slice = createSlice({
  name: name,
  initialState: { byId: {} },
  reducers: { /* */ }
}
slice.actions.myThunkAction = payload => async (dispatch, state) => {
  // ...
  slice.actions.nonThunkAction({ id: id, data: data})
  slice.actions.anotherNonThunkAction({ index payload.index, data: data.map( /* */ )})
}
import { createSlice } from "@reduxjs/toolkit"
import { startedLoading, finishedLoading, errorLoading } from '../slices/loadingSlice'
import encodeURLParams from '../tools/encodeURLParams'

const apiEndpoint = "/api/v1"
const fetchOptions = { headers: { "Content-Type": "application/json" } }

const createModelSlice = function (modelName) {
  const slice = createSlice({
    name: modelName,
    initialState: { byId: {} },
    reducers: {
      insert: (state, action) => {
        // ...
      },
      bulkInsert: (state, action) => {
        // ...
      },
    }
  })
  slice.actions.loadMany = payload => async (dispatch, state) => {
    dispatch(startedLoading({ key: /* */ }))
    try {
      const response = await fetch(/*  */)
      dispatch(slice.actions.insert(response))
      dispatch(finishedLoading({ key: /* */ }))
    } catch (error) {
      dispatch(errorLoading({ key: /* */ }))
    }
  }
  slice.actions.loadOne = payload => async (dispatch, state) => {
    dispatch(startedLoading({ key: /* */ }))
    try {
      const response = await fetch(/*  */)
      dispatch(slice.actions.bulkInsert(response))
      dispatch(finishedLoading({ key: /* */ }))
    } catch (error) {
      dispatch(errorLoading({ key: /* */ }))
    }
  }
  return slice
}

export default createModelSlice

关于redux-toolkit 在另一个 thunk reducer 的同一切片中使用 actionCreater,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59448133/

相关文章:

javascript - Normalizr 不处理信封中的数据

javascript - 了解去抖。 thunks 和赋值返回

reactjs - createAsyncThunk 并使用 redux-toolkit 编写 reducer 登录

reactjs - redux 工具包使用 typescript 模拟商店

redux - 使用 redux-toolkit 创建简单的选择器函数

javascript - 数字验证中的逻辑错误以及 React Js 中的百分比符号

javascript - 可能未处理的 promise 拒绝(id :0): undefined is not an object

react-native - React Native - 具有动态高度子项的 FlatList

Redux 等待异步操作完成

typescript - 我如何在 redux-toolkit 中使用 persist/rehydrate?