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

React-Query输入搜索关键词时重置页码为1,如何移除useEffect?

无需useEffect重置页码的优化方案

方案1:查询时动态指定页码(推荐)

直接在useQuery的查询逻辑里,根据搜索关键词是否存在动态决定使用的页码——有搜索词时强制用第1页,无搜索词时沿用当前page状态值。这样当搜索关键词变化时,自动以第1页发起请求,完全不需要额外的useEffect来修改page状态。

修改后的代码:

const [input, setInput] = useState<string>('');
const filtered = useDebounce(input, 300);

// 动态计算当前请求的页码:有搜索词时用1,否则用page状态值
const currentPage = filtered ? 1 : page;

const { data: items, isFetching, isLoading, error, isSuccess } = useQuery(
  ['taxpayer', taxpayer, currentPage, filtered], // 查询键同步使用动态页码
  () => index(taxpayer, currentPage, input), // 查询函数里传入动态页码
  {
    refetchOnWindowFocus: false,
    keepPreviousData: true,
    retry: false,
    enabled: open || Boolean(filtered),
    select: (response: any) => response.data
  }
);

方案2:在输入触发点直接重置页码

如果希望保持page状态的同步,可以把页码重置逻辑放在输入变化的触发环节,而不是用useEffect监听。比如给输入框绑定的change事件处理函数里,更新输入值的同时直接重置页码:

const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {
  const value = e.target.value;
  setInput(value);
  // 输入非空时直接把页码重置为1
  if (value.trim()) {
    setPage(1);
  }
};

如果你的useDebounce支持回调参数,也可以在防抖后的关键词生效时再执行重置:

const filtered = useDebounce(input, 300, () => {
  if (filtered) {
    setPage(1);
  }
});

方案优势

  • 方案1完全避免了状态同步的副作用,逻辑更内聚:搜索请求的页码直接由搜索状态决定,消除了useEffect可能带来的状态不同步风险。
  • 方案2把状态修改逻辑放在触发源里,比监听式的useEffect更直观,符合"谁触发谁修改"的逻辑,更容易理解和维护。

内容的提问来源于stack exchange,提问作者Mohammad A. Souri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 13:17:33