reactjs React useQuery在下拉列表打开时调用了多次

ycl3bljg  于 2022-12-12  发布在  React
关注(0)|答案(2)|浏览(189)

我正在使用“react-query”从一个组件调用一个API。为了回答这个问题,我将从API返回一个模拟响应。
每次打开下拉菜单时,都会调用useQuery函数,该函数又调用mock API。
App.js

import React from 'react';
import './style.css';
import { QueryClient, QueryClientProvider } from 'react-query';
import { DropDown } from './Dropdown.js';
const queryClient = new QueryClient();
export default function App() {
  return (
    <QueryClientProvider client={queryClient}>
      <div style={{ display: 'flex', justifyContent: 'center' }}>
        <DropDown />
      </div>
    </QueryClientProvider>
  );
}

Dropdown.js

import React from 'react';
import { useQuery } from 'react-query';

export const DropDown = () => {
  console.log('DropDown re-rendered');

  const { data, isLoading, isError } = useQuery('API', () => {
    return new Promise((resolve, reject) => {
      console.log('API called');
      resolve(['mockData']);
    });
  });

  return (
    <>
      <select>
        <option> 1 </option>
        <option> 2 </option>
      </select>
    </>
  );
};

您可以在此处找到演示:https://react-quxtxd.stackblitz.io
在控制台中,您将看到每次打开下拉列表时,都会调用useQuery。
Stackblitz编辑器网址:https://stackblitz.com/edit/react-quxtxd?file=src/Dropdown.js
作为避免这种情况的替代方法,我可以使用传统的useEffect进行API调用,但我希望利用useQuery提供的缓存优势,但由于这个“重新呈现”问题,我陷入了困境。
有任何建议/修改吗?

8dtrkrch

8dtrkrch1#

看起来原来的stackblitz已经被修复了,所以这个问题不再是可复制的。
您可能已经看到了由于聚焦窗口而导致的后台重取。这是因为staleTime默认为0refetchOnWindowFocus默认为true。您可以关闭该标志,或者设置更高的staleTime(推荐)。

ulmd4ohb

ulmd4ohb2#

这对我很有效

{ refetchOnWindowFocus: false }

用法:

const { data, status } = useQuery("users", fetchUsers, { 
    refetchOnWindowFocus: false 
});

相关问题