use*_*446 7 reactjs react-hooks react-query
我正在使用 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 key={item.id} invoice={item} />
)}
</ul>
</div>
)
}
Run Code Online (Sandbox Code Playgroud)
TkD*_*odo 16
您可以按照此处所述进行本地过滤,或者,如果您想在后端进行过滤,则需要:
keepPreviousData: true更好的用户体验 - 请参阅滞后查询就像是:
const fetchData = async (filter) => {
const res = await fetch(`http://localhost:3004/invoices/${filter}`);
return res.json();
};
const [filter, setFilter] = React.useState('all')
const {data, isLoading, isError} = useQuery(['invoices', filter], () => fetchData(filter));
Run Code Online (Sandbox Code Playgroud)
另外,我想指出,由于您正在使用fetch,您需要将错误的响应转换为失败的承诺,因为react-query 期望失败的承诺,但fetch不会开箱即用。请看这里