【问题标题】:Manually refresh react-query onClick with React使用 React 手动刷新 react-query onClick
【发布时间】:2021-12-17 20:29:13
【问题描述】:

当我重新获取我的查询时,当我有一个 onClick 按钮时它会进入“正在更新...”状态,但我希望查询重新获取并显示“正在加载...”状态。我的代码是:

https://stackblitz.com/edit/react-ts-jfq8ve?file=index.tsx

import React, { useEffect } from 'react';
import { render } from 'react-dom';
import { useQuery } from 'react-query';
import axios from 'axios';
import { QueryClient, QueryClientProvider } from 'react-query';

const App: React.FunctionComponent = () => {
  const [value, setValue] = React.useState<number>(7);

  const queryKey = 'getData';

  const getData = async (): Promise<any> => {
    await new Promise((resolve) => setTimeout(resolve, 1000));
    const response = await axios
      .get(`https://jsonplaceholder.typicode.com/todos`)
      .then((res) => res.data);
    return response;
  };

  const {
    data: result,
    status,
    isRefetching,
    error,
    refetch,
  }: any = useQuery(queryKey, getData, {
    refetchOnWindowFocus: true,
    staleTime: 0,
    cacheTime: 0,
    refetchInterval: 0,
  });

  useEffect(() => {
    refetch();
  }, [value, refetch]);

  return (
    <div className="Container">
      <button onClick={() => setValue(prevValue => prevValue + 1 )}>Set value</button>
      {isRefetching ? <p className="mt-3">Updating data...</p> : null}
      {status === 'error' && <div className="mt-5">{error.message}</div>}
      {status === 'loading' && <div className="mt-5">Loading data ...</div>}
      {status === 'success' && (
        <div>
          {result?.map((inner: any, index: number) => {
            return <li key={index}>{inner.title}</li>;
          })}
        </div>
      )}
    </div>
  );
};

const queryClient = new QueryClient();

render(
  <QueryClientProvider client={queryClient}>
    <App />
  </QueryClientProvider>,
  document.getElementById('root')
);

【问题讨论】:

    标签: javascript reactjs react-query


    【解决方案1】:

    根据Yozi的回答,我删除了useEffect,只是将refetch函数放到了按钮的onClick

      const {
        data: result,
        isFetching,
        status,
        error,
        refetch,
      }: any = useQuery(queryKey, getData, {
        refetchOnWindowFocus: true,
        staleTime: 0,
        cacheTime: 0,
        refetchInterval: 0,
      });
    
      return (
        <div className="Container">
          <button onClick={refetch}>Refetch query</button>
          {status === 'error' && <div className="mt-5">{error.message}</div>}
          {isFetching ? (
            <div className="mt-5">Loading data ...</div>
          ) : (
            <div>
              {status === 'success' && (
                <div>
                  {result?.map((inner: any, index: number) => {
                    return <li key={index}>{inner.title}</li>;
                  })}
                </div>
              )}
            </div>
          )}
        </div>
      );
    };
    

    在线示例:https://stackblitz.com/edit/react-ts-j87pub?file=index.tsx

    【讨论】:

      【解决方案2】:

      status === loading

      如果查询处于“硬”加载状态。这意味着没有缓存数据,query 当前正在获取...

      我猜你不需要为你的特殊情况使用status === loading。使用isFetching - 它涵盖了初始加载和重新获取

      
      import React, { useEffect } from 'react';
      import { render } from 'react-dom';
      import { useQuery } from 'react-query';
      import axios from 'axios';
      import { QueryClient, QueryClientProvider } from 'react-query';
      
      const App: React.FunctionComponent = () => {
        const [value, setValue] = React.useState<number>(7);
      
        const queryKey = 'getData';
      
        const getData = async (): Promise<any> => {
          await new Promise((resolve) => setTimeout(resolve, 1000));
          const response = await axios
            .get(`https://jsonplaceholder.typicode.com/todos`)
            .then((res) => res.data);
          return response;
        };
      
        const {
          data: result,
          status,
          isFetching,
          error,
          refetch,
        }: any = useQuery(queryKey, getData, {
          refetchOnWindowFocus: true,
          staleTime: 0,
          cacheTime: 0,
          refetchInterval: 0,
        });
      
        useEffect(() => {
          refetch();
        }, [value, refetch]);
      
        return (
          <div className="Container">
            <button onClick={() => setValue(prevValue => prevValue + 1 )}>Set value</button>
            {status === 'error' && <div className="mt-5">{error.message}</div>}
            {isFetching && <div className="mt-5">Loading data ...</div>}
            {status === 'success' && (
              <div>
                {result?.map((inner: any, index: number) => {
                  return <li key={index}>{inner.title}</li>;
                })}
              </div>
            )}
          </div>
        );
      };
      
      const queryClient = new QueryClient();
      
      render(
        <QueryClientProvider client={queryClient}>
          <App />
        </QueryClientProvider>,
        document.getElementById('root')
      );
      
      
      

      【讨论】:

      • 如何根据上面的代码实现改变?
      猜你喜欢
      • 2021-12-17
      • 1970-01-01
      • 1970-01-01
      • 2019-01-07
      • 2021-08-06
      • 2020-08-19
      • 1970-01-01
      • 2021-07-30
      • 2018-04-10
      相关资源
      最近更新 更多