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

RTK Query中selectById失效、task为undefined问题求助

RTK Query selectById 失效,task变量返回undefined(responseData数据正常且ID匹配)

我正在使用本地JSON数据测试RTK Query查询,遇到selectById无法正常工作的问题,最终得到的task变量始终为undefined。目前确认在执行selectById步骤之前的流程均正常,responseData中包含所需数据且目标ID确实存在于数据中,反复排查仍找不到问题所在。

已查阅RTK Query官方文档但未解决问题,以下附上相关代码及信息,恳请各位提供帮助:

本地JSON数据

[
  {
    "id": "1",
    "title": "完成RTK Query测试",
    "content": "调试selectById逻辑"
  },
  {
    "id": "2",
    "title": "整理代码示例",
    "content": "准备Stack Overflow提问素材"
  }
]

tasksSlice 代码

import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react';

export const tasksApi = createApi({
  reducerPath: 'tasksApi',
  baseQuery: fetchBaseQuery({ baseUrl: './data/' }),
  endpoints: (builder) => ({
    getAllTasks: builder.query({
      query: () => 'tasks.json',
      providesTags: ['Task']
    }),
    getTaskById: builder.query({
      query: (taskId) => 'tasks.json',
      selectFromResult: ({ data }) => data?.find(task => task.id === taskId)
    })
  })
});

export const { useGetAllTasksQuery, useGetTaskByIdQuery } = tasksApi;

Home 组件代码

import { Link } from 'react-router-dom';
import { useGetAllTasksQuery } from './tasksSlice';

export default function Home() {
  const { data: tasks, isLoading, error } = useGetAllTasksQuery();

  if (isLoading) return <div>加载中...</div>;
  if (error) return <div>加载任务列表失败</div>;

  return (
    <div className="task-list">
      <h2>任务列表</h2>
      {tasks.map(task => (
        <div key={task.id} className="task-item">
          <Link to={`/tasks/${task.id}`}>{task.title}</Link>
        </div>
      ))}
    </div>
  );
}

TaskContainer 组件代码

import { useParams } from 'react-router-dom';
import { useGetTaskByIdQuery } from './tasksSlice';

export default function TaskContainer() {
  const { id } = useParams();
  const { data: task, isLoading, error } = useGetTaskByIdQuery(id);

  console.log('当前ID:', id);
  console.log('获取到的任务:', task); // 此处输出undefined

  if (isLoading) return <div>加载任务详情中...</div>;
  if (error) return <div>加载任务详情失败</div>;
  if (!task) return <div>未找到对应任务</div>;

  return (
    <div className="task-detail">
      <h2>{task.title}</h2>
      <p>{task.content}</p>
    </div>
  );
}

responseData 截图说明

截图显示responseData为包含对应ID任务的数组,数据结构与内容均符合预期,ID匹配无误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 02:42:48