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

如何在RTK Query中用上一次查询数据作为同查询下一次调用参数?

解决方案

你原来的写法报错是因为data是useUsersQuery的返回值,组件首次渲染时data还未定义,没法直接作为参数传入同一个hook。下面是几种更优雅的实现方式:

方案1:本地状态维护cursor,自动/手动触发查询

用useState存当前的token/cursor,每次查询返回新数据后更新状态,RTK Query会自动根据参数变化重新发起请求:

import { useState, useEffect } from 'react';
import { useUsersQuery } from './your-api-slice';

const UsersComponent = () => {
  // 初始token设为null,对应首次查询的默认参数
  const [currentToken, setCurrentToken] = useState(null);
  const { data } = useUsersQuery({ someToken: currentToken });

  // 如果需要自动加载下一页,数据返回后更新token
  useEffect(() => {
    if (data?.someToken) {
      setCurrentToken(data.someToken);
    }
  }, [data]);

  // 如果是手动加载,写个点击事件
  const loadNextPage = () => {
    if (data?.someToken) {
      setCurrentToken(data.someToken);
    }
  };

  return (
    <div>
      {/* 渲染用户列表 */}
      <button onClick={loadNextPage}>加载更多</button>
    </div>
  );
};

方案2:直接从RTK Query缓存读取上一次的token

RTK Query的缓存可以通过useSelector直接访问,不需要额外维护本地状态:

import { useSelector } from 'react-redux';
import { useUsersQuery, usersApi } from './your-api-slice';

const UsersComponent = () => {
  // 从缓存中获取上一次查询返回的token
  const lastToken = useSelector(state => {
    // 这里的参数要和首次查询的参数一致,才能找到对应的缓存条目
    const cacheEntry = usersApi.endpoints.getUsers.select({ someToken: null })(state);
    return cacheEntry.data?.someToken;
  });

  // 用缓存里的lastToken作为参数,首次查询时lastToken为null,走初始逻辑
  const { data } = useUsersQuery({ someToken: lastToken });

  return <div>{/* 渲染内容 */}</div>;
};

方案3:优化useLazyQuery的写法

如果坚持用useLazyQuery,可以把逻辑拆分得更清晰,避免直接依赖未初始化的data:

import { useState, useEffect } from 'react';
import { useLazyUsersQuery } from './your-api-slice';

const UsersComponent = () => {
  const [triggerQuery, { data }] = useLazyUsersQuery();
  const [currentToken, setCurrentToken] = useState(null);

  // 首次加载
  useEffect(() => {
    triggerQuery({ someToken: currentToken });
  }, []);

  // 手动触发下一页
  const loadNext = () => {
    if (data?.someToken) {
      setCurrentToken(data.someToken);
      triggerQuery({ someToken: data.someToken });
    }
  };

  return (
    <div>
      {/* 渲染列表 */}
      <button onClick={loadNext}>加载更多</button>
    </div>
  );
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 20:55:19