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

如何通过React Query调用不同API更新表格展示的已获取数据?

解决React Query点击表头排序更新表格数据的问题

第一步:优化API请求函数

合并重复逻辑,封装成通用的成员查询函数,支持动态传入排序、分页及状态参数:

// Api 
export const getMembers = async ({ 
  orderBy = "FirstName", 
  order = "DESC", 
  pageNumber = 1, 
  pageSize = 50, 
  status = "Enrolled" 
}) => {
  const response = await MemberApi.get(`/query?orderBy=${orderBy}&order=${order}&pageNumber=${pageNumber}&pageSize=${pageSize}&status=${status}`);
  return response.data;
};

第二步:重构组件实现排序功能

利用React Query的queryKey特性,将排序参数纳入缓存标识,参数变化时自动触发新查询;同时用状态管理当前排序规则,点击表头时更新状态:

// Members
import { useQuery } from '@tanstack/react-query';
import { useState } from 'react';
import { getMembers } from './api';

function Members() {
  // 管理当前排序字段和方向
  const [sortConfig, setSortConfig] = useState({
    key: 'FirstName',
    direction: 'DESC'
  });

  // 排序参数加入queryKey,参数变化自动触发新查询
  const { data: enrolled, isLoading } = useQuery({
    queryKey: ["enrolled", sortConfig],
    queryFn: () => getMembers({
      orderBy: sortConfig.key,
      order: sortConfig.direction,
      pageSize: 50,
      status: "Enrolled"
    })
  });

  // 表头点击事件:切换排序字段或反转方向
  const handleHeaderClick = (key) => {
    let direction = 'ASC';
    if (sortConfig.key === key && sortConfig.direction === 'ASC') {
      direction = 'DESC';
    }
    setSortConfig({ key, direction });
  };

  if (isLoading) return <div>加载中...</div>;
  if (!enrolled) return <div>暂无数据</div>;

  return (
    <>
      {/* 可点击表头,显示当前排序状态 */}
      <div style={{ display: 'flex', gap: '30px', cursor: 'pointer', fontWeight: 'bold' }}>
        <div onClick={() => handleHeaderClick('FirstName')}>
          姓名 {sortConfig.key === 'FirstName' && (sortConfig.direction === 'ASC' ? '↑' : '↓')}
        </div>
        <div onClick={() => handleHeaderClick('LastName')}>
          姓氏 {sortConfig.key === 'LastName' && (sortConfig.direction === 'ASC' ? '↑' : '↓')}
        </div>
      </div>

      {/* 成员列表展示 */}
      <div style={{ marginTop: '15px' }}>
        {enrolled.map((member, index) => (
          <div key={index} style={{ padding: '8px 0' }}>
            {member.firstName} {member.lastName}
          </div>
        ))}
      </div>
    </>
  );
}

关键修正与说明

  • 自动触发查询:将排序参数加入queryKey,React Query会自动识别参数变化并发起新请求,替代原代码中手动调用setQueryData的异步错误写法。
  • 排序状态切换:点击表头时,若点击的是当前排序字段则反转方向,否则切换为该字段的升序排序,符合常规表格交互逻辑。
  • 状态处理:补充加载状态与空数据判断,避免因数据未返回导致的渲染报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 14:00:18