标签: react-query

反应查询重用项目缓存中的项目

想象一下当您有项目列表和项目视图时的典型用例。

所以有一个端点来获取所有项目。但您也可以使用 获取单个项目/items/:id

但是,如果已从端点获取单个项目,则可以避免获取该项目/items。那么你会如何处理呢react-query

function Items() {
  cosnt itemsQuery = useQuery('items', fetchItems);
  // render items
}
      
function SingleItem({ id }) {
  // you can have another query here and refetch item from server
  // but how to reuse an item from query cache and fetch only if there is no such item?
}
Run Code Online (Sandbox Code Playgroud)

react-query

8
推荐指数
1
解决办法
2万
查看次数

使用react-testing-library测试useQuery

我正在尝试测试 useQuery 挂钩。测试 (expect(screen.getByText(/Loading.../)).not.toBeInTheDocument()) 似乎失败。我只是不断在 dom 中加载文本,而不是标题。尽管mockResolved已被分配/知道为什么会发生这种情况吗?整个目标是测试 isLoading 和 isError。下面是代码

索引.js

import React from "react";
import ReactDOM from "react-dom";
import App from "./App";
import { QueryClient, QueryClientProvider } from "react-query";

const queryClient = new QueryClient();

ReactDOM.render(
  <React.StrictMode>
    <QueryClientProvider client={queryClient}>
      <App />
    </QueryClientProvider>
  </React.StrictMode>,
  document.getElementById("root")
);

Run Code Online (Sandbox Code Playgroud)

应用程序

import React, { useState, Fragment } from "react";
import { useQuery } from "react-query";
import { getManagers } from "./api/index";
import CustomInputSelect from "./components/CustomInputSelect";
import { processEmployeeData } from "./utils/index";
import "./App.scss";

const App …
Run Code Online (Sandbox Code Playgroud)

reactjs react-testing-library react-query

8
推荐指数
0
解决办法
1万
查看次数

如何使用react-query将来自不同react-query钩子的数据同步连接在一起?

我有三种不同的数据类型:BooksAuthorsPublishers。我使用react-query来获取每种类型的列表,即useBooks(bookIds),,,当我尝试彼此独立地使用它们时,这非常有用useAuthors(authorIds)usePublishers(publisherIds)

authorIds但是,一本书有和的列表publisherIds,我想将PublishersAuthors对象加入到Books。我无法找出使用反应查询执行此操作的正确方法。理想情况下,我希望能够调用所有三个钩子,等待它们的响应,然后将其作为一个大钩子返回。然而,我无法专心去做这件事。

我尝试的一种实现是使连接数据的每个钩子依赖Book于前一个钩子的结果。这工作正常;然而,这样做的一个大问题是连接是彼此异步完成的;一旦返回数据,组件消耗的数据就不能期望 aBook具有 aAuthor或。Publisher这是一个例子:

const usePopulatedBooks = (bookIds) => {
    const booksQuery = useBooks(bookIds);

    const {data: books} = booksQuery;

    const authorIds = [];
    const publisherIds = [];

    if (books) {
        books.forEach(book => {
            authorIds.push(book.authorId);
            authorIds.push(book.publisherIds);
        })
    }

    // Who knows when this finishes?
    const {data: authors} = useAuthors(authorIds);

    // Who knows …
Run Code Online (Sandbox Code Playgroud)

javascript reactjs react-hooks react-query

7
推荐指数
1
解决办法
1万
查看次数

将react-query 测试与testing-library 集成

目的

我正在构建一个使用 React-query 来获取数据的 NextJS 应用程序。

我现在正在尝试实现一个测试框架。但是,当我运行时yarn test,出现以下错误。从react-query文档中,我了解到错误通常与<QueryClientProvider>未包含在_app.js.

我怀疑我需要为反应查询引入一些“模拟数据”,index.test.js但无法找到有关如何执行此操作的文档。

错误

No QueryClient set, use QueryClientProvider to set one
Run Code Online (Sandbox Code Playgroud)

代码

/测试/index.test.js

No QueryClient set, use QueryClientProvider to set one
Run Code Online (Sandbox Code Playgroud)

/pages/index.js

import { render, screen } from '@testing-library/react';

import Home from '../pages/index';

describe('Home', () => {
    it('renders without crashing', () => {
        render(<Home />);

        expect(
            screen.getByRole('heading', { name: 'Welcome to Next.js!' })
        ).toBeInTheDocument();
    });
});
Run Code Online (Sandbox Code Playgroud)

/pages/_app.js

import Link from 'next/link';
import { …
Run Code Online (Sandbox Code Playgroud)

reactjs next.js react-testing-library react-query

7
推荐指数
1
解决办法
1万
查看次数

如何使用 React query v3 使缓存失效?

我已阅读有关查询无效的反应查询文档。然而,它似乎对我不起作用。这是代码:

import React from "react";
import ax from "axios";
import { useQueryClient, useQuery } from "react-query";

export default function App() {
  const queryClient = useQueryClient();
  const [poke, setPoke] = React.useState("pikachu");
  
  const getPokemon = async (id) => {
    try {
      const pokemon = await ax.get("https://pokeapi.co/api/v2/pokemon/" + id);
      return pokemon;
    } catch (err) {
      throw new Error();
    }
  };

  const { data, isLoading, isError } = useQuery(
    ["get-pokemon", poke],
    () => getPokemon(poke),
    { cacheTime: 100000000 }
  );

  const getGengar = () => …
Run Code Online (Sandbox Code Playgroud)

reactjs react-query

7
推荐指数
1
解决办法
1万
查看次数

使用 React Query 过滤从 API 获取的列表

我正在使用 React Query(第一次)来管理对 API 的调用。我正在获取发票列表,到目前为止我已经在下面的代码中成功完成了此操作。我现在想根据每个发票对象具有的状态属性(它是“已付款”、“待处理”或“草稿”)使用一系列复选框来过滤此列表。

我该怎么办呢?过滤是否可以以某种方式集成到对 API 的初始调用中,以便我始终接收一组数据,或者我是否必须进行多次调用并在下面相应地呈现数据?

import React from 'react'
import {useQuery} from 'react-query'
import InvoiceLink from './InvoiceLink'

const fetchData = async () => {
    const res = await fetch('http://localhost:3004/invoices');
    return res.json();
};


export default function InvoiceList() {
    const {data, isLoading, isError} = useQuery('invoices', fetchData);
    return (
        <div>
            <ul>
                <li><input type="checkbox" id="paid"></input><label htmlFor="paid">Paid</label></li>
                <li><input type="checkbox" id="pending"></input><label htmlFor="pending">Pending</label></li>
                <li><input type="checkbox" id="draft"></input><label htmlFor="draft">Draft</label></li>
            </ul> 
            {isError && (
                <p>Error</p>
            )}
            {isLoading && (
                <p>Loading</p>
            )}
            <ul>
            {data && data.map(item => 
                <InvoiceLink …
Run Code Online (Sandbox Code Playgroud)

reactjs react-hooks react-query

7
推荐指数
1
解决办法
2万
查看次数

当我返回选项卡时,为什么 useQuery 使我的组件重新渲染?

我正在使用react-query库,我查了一下,useQuery可以使你的react组件重新渲染,因为它有状态,但奇怪的是,当我更改选项卡时它会重新渲染(例如,我去youtube,然后返回我的应用程序,该组件刚刚重新渲染)。但它只发生在 useQuery 中,我不明白为什么。

编辑:当我单击控制台然后再次单击应用程序时也会发生这种情况

代码很简单:

const { data } = useQuery("pokemon", () =>
    axios("https://pokeapi.co/api/v2/pokemon/")
);
console.log(data);
Run Code Online (Sandbox Code Playgroud)

这确实正在发生。每次我返回应用程序时,它都会再次记录数据。我不知道我错过了什么

javascript reactjs axios react-hooks react-query

7
推荐指数
1
解决办法
4255
查看次数

使用 useMutation 重试(反应查询)

当react-query中突变失败时,如何重试?\n如果有错误,我想重试突变3次。

\n

我读过坦纳提到的这篇文章you\xe2\x80\x99ll have to build your own promise retry wrapper.,但是,我该怎么做呢?

\n

我的职能是:

\n
const [accessSelectPage, accessSelectPageInfo] = useMutation(\n    () =>\n      axios.post(\n        POST_ACCESS_SELECT_PAGE_EP(token ?? \'\'),\n        {},\n        {\n          headers: { \'X-Campaign-ID\': campaignID }\n        }\n      ),\n    {\n      onSuccess: (responseOnSuccess) => {\n        console.log(\'accessSelectPage\', responseOnSuccess)\n      },\n      onError: (error) => {\n        console.log(\'accessSelectPage error\', error)\n      }\n    }\n  )\n
Run Code Online (Sandbox Code Playgroud)\n

注意:是的,我知道 v3 有一个“重试”选项,但我正在使用 v2,并且由于多种原因更新反应查询不可行。

\n

reactjs react-query

7
推荐指数
1
解决办法
6463
查看次数

React Query 在全局 onError 处理程序中获取错误状态代码

创建时,queryClient我想创建一个全局onError处理程序,当错误响应代码为 401 时刷新我的访问令牌。但我不知道如何在onError处理程序中返回的错误上访问状态代码。

下面是我的全局onError处理程序,我只需要访问 if 语句中的响应代码即可在适当的时间刷新我的令牌。

const queryClient = new QueryClient({
  queryCache: new QueryCache({
    onError: async (error, query) => {
      // How to get status code fo error
      if (error.status === 401) {
        console.log("Refreshing Token");
        await api.get("/api/refresh-token");
        queryClient.refetchQueries(query.queryKey);
      }
    },
  }),
});
Run Code Online (Sandbox Code Playgroud)

reactjs axios react-query

7
推荐指数
2
解决办法
2万
查看次数

React Query 返回未定义的数据,而在网络选项卡中数据存在但不显示在页面上

数据来自后端,我可以在网络选项卡中看到它,但是反应查询返回未定义的数据,它甚至没有对数据做出反应,因为它在控制台中返回错误的加载和获取,并且开发工具设置为新鲜(1) 。它之前可以工作,但现在似乎无法找到解决方案。

这是我的 App.js:

const queryClient = new QueryClient({
  defaultOptions: {
    queries: {
      staleTime: Infinity,
      cacheTime: 0,
    },
  },
});

function App() {
  return (
    <QueryClientProvider client={queryClient} contextSharing={true}>
      <PrivateRoute
        exact
        path="/dashboard/snp/match"
        component={MatchedSequences}
      />
      <ReactQueryDevtools initialIsOpen />
    </QueryClientProvider>
  );
}
Run Code Online (Sandbox Code Playgroud)

导出默认应用程序;

这是我的组件:

const queryClient = useQueryClient();
  const [showQuery, setShowQuery] = useState(false);
  const [showSequence, setShowSequence] = useState(false);

  const { isLoading, isFetching, error, data, status } = useQuery(
    "dn",
    () => {
      fetch("/api/users/find").then((res) => {
        return res.json();
      });
    },
    { keepPreviousData: false }, …
Run Code Online (Sandbox Code Playgroud)

javascript reactjs react-query

7
推荐指数
1
解决办法
3万
查看次数