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

使用Redux RTK实现数据获取及状态监听问题求助

Redux RTK 问题修复:Store、Slice 与 Dispatch 错误

下面是你代码中的核心问题及对应修复方案:


1. Store 配置错误

你在configureStore里错误地将addPlayer这个action当作reducer传入,正确做法是传入slice导出的根reducer。

修复后的store代码:

//@ts-nocheck
import { configureStore } from '@reduxjs/toolkit'
import { playerSlice } from './playerSlice'

export const store = configureStore({
  reducer: {
    players: playerSlice.reducer, // 使用slice的reducer而非单个action
  },
})

export type RootState = ReturnType<typeof store.getState>;

2. Dispatch 调用错误

你直接dispatch了action creator本身,没有调用它(如果是异步action或带payload的同步action,必须调用后再dispatch)。

场景A:触发API获取玩家数据

如果按钮是用来加载接口数据,修改组件代码:

import { getPlayers } from './playerSlice';

const NextPage = () => {
  const dispatch = useDispatch();
  return (
      <ButtonNext
        onClick={() => {
          dispatch(getPlayers()); // 调用异步action creator并dispatch
        }}
        text="< Back"
      />
  );
};

export default NextPage;

场景B:手动添加单个玩家

如果按钮是用来新增玩家,需要给addPlayer传入符合IPlayerProps的payload:

import { addPlayer } from './playerSlice';

const NextPage = () => {
  const dispatch = useDispatch();
  return (
      <ButtonNext
        onClick={() => {
          // 传入符合类型定义的玩家数据
          dispatch(addPlayer({ id: '1', name: 'New Player' }));
        }}
        text="< Back"
      />
  );
};

export default NextPage;

3. 选择器(Selector)错误

你的selectPlayers选择器路径错误,实际玩家数组存在state.players.players节点下。

修复后的选择器:

export const selectPlayers = (state: RootState) => state.players.players;
// 额外添加状态选择器,方便监听加载状态
export const selectPlayersStatus = (state: RootState) => state.players.status;

额外优化:ExtraReducers 推荐写法

虽然旧的对象写法可运行,但RTK官方更推荐builder回调写法,类型更安全:

const playerSlice = createSlice({
  name: 'players',
  initialState,
  reducers: {
    addPlayer: (state, action: PayloadAction<IPlayerProps>) => {
      console.log('done');
      state.players.push(action.payload);
    }
  },
  extraReducers: (builder) => {
    builder
      .addCase(getPlayers.pending, (state) => {
        console.log('loading');
        state.status = 'loading';
      })
      .addCase(getPlayers.fulfilled, (state, action) => {
        console.log('succeeded');
        state.status = 'succeeded';
        state.players = state.players.concat(action.payload);
      });
  }
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 01:05:19