打开下拉菜单时多次调用 React useQuery

Ana*_*ble 3 javascript reactjs react-query

我正在使用“react-query”从组件调用 API。为了解决这个问题,我将从 API 返回一个模拟响应。

每次,我打开下拉菜单时,都会调用 useQuery 函数,该函数又调用模拟 API。

应用程序.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>
  );
}
Run Code Online (Sandbox Code Playgroud)

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>
    </>
  );
};
Run Code Online (Sandbox Code Playgroud)

您可以在这里找到演示: https: //react-quxtxd.stackblitz.io

在控制台中,您将看到每次打开下拉菜单时,都会调用 useQuery 。

Stackblitz 编辑器网址:https://stackblitz.com/edit/react-quxtxd ?file=src/Dropdown.js

作为避免这种情况的替代方案,我可以使用传统的 useEffect 进行 API 调用,但我一直在考虑利用 useQuery 提供的缓存优势,但由于这个“重新渲染”问题,我陷入了困境。

有什么建议/修改吗?

Anj*_*tam 7

这对我有用

{ refetchOnWindowFocus: false }
Run Code Online (Sandbox Code Playgroud)

用法:

const { data, status } = useQuery("users", fetchUsers, { 
    refetchOnWindowFocus: false 
});
Run Code Online (Sandbox Code Playgroud)

如果您的所有查询都需要此配置。最好将其添加到defaultOptions您的 queryClient 中

// App.tsx

const queryClient = new QueryClient({
  defaultOptions: {
    queries: {
      refetchOnWindowFocus: false,
    },
  },
});

<QueryClientProvider client={queryClient}>
...
</QueryClientProvider>
Run Code Online (Sandbox Code Playgroud)