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

Posted

技术标签:

【中文标题】redux-toolkit 在来自另一个 thunk reducer 的同一切片中使用 actionCreater【英文标题】:redux-toolkit use an actionCreater in the same slice from another thunk reducer 【发布时间】:2020-04-14 07:38:06 【问题描述】:

我有一个使用 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: /* */ ))
        
      ,
      // ...
    
  )

【问题讨论】:

【参考方案1】:

我错过了有关切片无法使用 thunk 的部分文档。无论哪种方式,它都不会起作用,因为 thunk 动作不会映射到减速器,而是将其他动作分派到多个其他减速器/动作。

我在创建切片后向切片操作添加了 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的主要内容,如果未能解决你的问题,请参考以下文章

WebStorm 中的 Redux-toolkit 操作参数

“AsyncThunkAction”Redux-toolkit 类型上不存在属性“then”

如何将 redux-toolkit createSlice 与 React 类组件一起使用

createAsyncThunk 和使用 redux-toolkit 编写 reducer 登录

关于 redux-toolkit redux-saga 的一些问题

Redux-Toolkit 和 React Hooks - 存储更改不会触发重新渲染