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

Next.js+TypeScript中使用ReactQuery如何向外部异步函数传参

问题原因

当前写法存在两个核心错误:

  • 直接写getProducts(1)会在组件渲染时立即执行请求函数,最终传给useQuery的是函数执行返回的Promise实例,而useQuery需要接收的是可被框架自主调用的函数引用,不符合API要求。
  • 仅用字符串"products"作为查询键(query key),React Query无法感知传入的id参数变化:后续如果id修改不会自动触发重拉,也无法根据不同参数隔离缓存数据。
修复方案

1. 调整useQuery的传参方式

把查询键改成数组格式,将动态参数放入键中;查询函数用箭头函数包裹,延迟执行时机,交由React Query自主调用:

// 查询键["products", 1]和参数绑定,id变化时键会同步变化,自动触发重新请求
const { isLoading, data, error } = useQuery(["products", 1], () => getProducts(1));

如果id是来自动态值(路由参数、组件状态等),直接替换硬编码的1即可:

const productId = 1; // 替换为实际动态值
const { isLoading, data, error } = useQuery(["products", productId], () => getProducts(productId));

2. 修正类型定义问题

当前getProducts请求的是单商品详情接口/products/${id},返回值是单个商品对象而非数组,需要把返回类型从ProductApi[]改为ProductApi,避免TS类型校验报错:

export const getProducts = async (id: number) => {
    const rest = await fetch(
        `https://fakestoreapi.com/products/${id}`
    );
    // 移除数组符号,匹配接口实际返回结构
    const data: ProductApi = await rest.json();
    return data;
};
修复后完整页面代码
import { useQuery } from "react-query";
import { getProducts } from "../components/task-1/getProducts-0";

export const ProductsPage = () => {
  const { isLoading, data, error } = useQuery(["products", 1], () => getProducts(1));

  if (isLoading) {
    return <div>Loading...</div>;
  }

  if (!data || error) {
    return <div>Error#!</div>;
  }

  return <>...</>;
};

export default ProductsPage;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 14:19:19