You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从createAsyncThunk向页面传递多个动态参数?

如何在createAsyncThunk中传递多组参数?

我之前习惯用单个参数(如id)进行传递,从未尝试过传递一组参数。现在需要通过createAsyncThunk传递rowTitle、sortingMetric、dateGranularity、weekStartDate这多个参数,尝试过解构参数对象的方式但没生效。硬编码参数可以正常运行,但我需要将这些参数作为props传递,使其能随页面状态变化而更新。

原Slice代码

import { createSlice, createAsyncThunk } from "@reduxjs/toolkit";
import axios from "axios";

const KEY = process.env.REACT_APP_API_KEY
const URL = process.env.REACT_APP_BASE_URL
const API = `${URL}/interimtoptitles`

const initialState = {
  carouseldata:{},
  status: 'idle',  //'idle', 'loading', 'succeeded', 'failed'  
  error:null
}

export const fetchCarouselData = createAsyncThunk(
  'carouseldata/fetchCarouselData', 
  async (rowTitle, sortingMetric, dateGranularity, weekStartDate) => { 
    try {
      const response = await axios.get(
        API,
        {
          headers: {
            'Content-Type': 'application/json',
            'X-API-KEY': KEY,
          },
          params: {
            rowTitle:         rowTitle,
            sortingMetric:    sortingMetric,
            dateGranularity:  dateGranularity,
            weekStartDate:    weekStartDate
          },
        }
      )
      const loadedCarousel = response.data.Item;

      console.log("loadedCarousel: ", loadedCarousel);
      return loadedCarousel;

    } catch (error) {
      console.error('API call error:', error.message);
    }
  }
)

const carouselSlice = createSlice({
  name: 'carouseldata',
  initialState,
  reducers:{},
  extraReducers: {
    [fetchCarouselData.pending]: (state, action) => {
      state.status = "loading"
    },
    [fetchCarouselData.fulfilled]: (state, { payload }) => {
      state.status = 'succeeded'
      state.carouseldata = payload
    },
    [fetchCarouselData.rejected]: (state, action) => {
      state.status = "failed"
    },
  }
})

// SELECTORS
export const getCarouselData = (state) => state.carouseldata.carouseldata;
export const getCarouselStatus = (state) => state.carouseldata.status;

export default carouselSlice.reducer

原页面简化代码

const [state, setState] = useState({
  category: "Saved Titles",
  metric: "liked",
  granularity: "All Time",
  startdate: convertDate(getPrevMonday(new Date(addDays(prevMonday, -7)))),
  enddate: prevSunday, //all are required except this one
})

const {rowTitle, sortingMetric, dateGranularity, weekStartDate} = useParams();
const dispatch = useDispatch();

const carouseldata = useSelector(getCarouselData);
const status = useSelector(getCarouselStatus)

useEffect(() => { 
  dispatch(fetchCarouselData({
    rowTitle: state.category, 
    sortingMetric: state.metric, 
    dateGranularity: state.granularity, 
    weekStartDate: state.startdate,
  })); 

}, 
  [
    dispatch, 
    state.category, 
    state.metric, 
    state.granularity, 
    state.startdate, 
    state.enddate, 
    rowTitle, 
    sortingMetric, 
    dateGranularity, 
    weekStartDate
  ]
);

解决方案

问题出在createAsyncThunk的回调函数仅支持接收单个参数。你现在dispatch时传入的是一个参数对象,但thunk里却把它拆成了四个独立参数,导致后三个参数都是undefined,自然无法正确传递。

修改方式如下:

1. 修正Slice中的fetchCarouselData

将thunk的回调参数改为接收一个对象,并解构出需要的字段:

export const fetchCarouselData = createAsyncThunk(
  'carouseldata/fetchCarouselData', 
  // 接收单个参数对象,直接解构
  async ({ rowTitle, sortingMetric, dateGranularity, weekStartDate }) => { 
    try {
      const response = await axios.get(
        API,
        {
          headers: {
            'Content-Type': 'application/json',
            'X-API-KEY': KEY,
          },
          params: {
            rowTitle,
            sortingMetric,
            dateGranularity,
            weekStartDate
          },
        }
      )
      const loadedCarousel = response.data.Item;

      console.log("loadedCarousel: ", loadedCarousel);
      return loadedCarousel;

    } catch (error) {
      console.error('API call error:', error.message);
      // 抛出错误让rejected状态捕获
      throw error;
    }
  }
)

2. 优化页面的useEffect依赖(可选)

你的useEffect依赖数组里包含了useParams的字段,但当前dispatch时并没有用到这些字段,而是用了state里的值。如果不需要这些URL参数,可以从依赖数组中移除,避免不必要的重触发:

useEffect(() => { 
  dispatch(fetchCarouselData({
    rowTitle: state.category, 
    sortingMetric: state.metric, 
    dateGranularity: state.granularity, 
    weekStartDate: state.startdate,
  })); 

}, 
  [
    dispatch, 
    state.category, 
    state.metric, 
    state.granularity, 
    state.startdate
  ]
);

这样修改后,参数就能正确传递,并且会随着页面state的变化自动更新请求。


内容的提问来源于stack exchange,提问作者LOTUSMS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 03:10:35