链接 reactQuery 调用
chaining reactQuery calls
我在制作一些 useQuery 链式获取数据时遇到问题,我已经询问过但无法正常工作,
有一个类别列表,我想从 API 中获取,axios.get("categories")
然后我想根据类别列表获取子类别:axios.get("tutorials/{categoriesName}")
我想使用 UseQuery 挂钩,这样我就可以处理缓存并停止不必要的重新渲染,我已经用简单的 useEffect 完成了这个,但是网站渲染速度太慢所以我想学习 useQuery 方法,
function AllCategories() {
const { isLoading, error, data, isFetching } = useQuery("categories", () =>
axios.get("/categories").then((res) => res.data)
);
console.log(data);
if (isLoading) return "Loading...";
if (error) return "An error has occurred: " + error.message;
//there are like 5 MAIN categories which i have used useQuery to fetch and handle Caching ,
//here i want to get the subcategories from each Main Category , can i chain useQueries ?
return (
<div>
{data.map((item) => {
return <div>{item.name}</div>;
})}
<div>{isFetching ? "Updating..." : ""}</div>
<ReactQueryDevtools initialIsClose />
</div>
);
}
export default AllCategories;
我不知道解决这个问题的正确方法,因为 none 的例子有多个依赖的 useQueries 链接,我不确定即使这是可能的,
澄清一下,我想像这样在 Ui 中呈现数据:PartentCategoryA..subCategorya .PartentCategoryB..subCategoryb PartentCategoryC..subCategoryc
而不是 PartentCategoryA.PartentCategoryB PartentCategoryC .subCategorya ...subCategoryb ..subCategoryc 这就是使这项任务比应有的更难的原因
这是没有 reactQuery 的:
export default function AllCategoriesPage() {
const [categories, setCategories] = useState([]);
const [finalList, setFinalList] = useState([]);
useEffect(() => {
axios.get("/categories").then((response) => {
setCategories(response.data);
});
}, [categories.length]);
useEffect(() => {
setFinalList(categories);
categories.map(async (category) => {
await axios
.get(`/categories/${category.name}`)
.then((res) => {
const mysub = res.data;
category.subCategories = mysub;
})
.then(() => {
setFinalList([...categories]);
});
});
}, [categories.length]);
return (
<div className="allCategoriesPage-wrapper">
{finalList.length === 0 && (
<div className="loader-container">
<Loader />
</div>
)}
<div className="allCategoriesPage-container">
{finalList.length > 0 &&
finalList.map((category) => {
return (
<React.Fragment>
<div className="single-category-wrapper-main-cat ">
{category.name}
</div>
{category.subCategories &&
category.subCategories.map((subcategory) => {
return (
<Link to={`/categories/${subcategory.name}`}>
<div className="single-category-wrapper">
{subcategory.name}
<div className="single-category-img-container">
<img
className="single-category-image"
src={`http://localhost:3001/tutorials/${subcategory.name}/avatar`}
></img>
</div>
</div>
</Link>
);
})}
</React.Fragment>
);
})}
</div>
</div>
);
}
提前致谢
一个很好的方法是使用 React Query 的“依赖查询”文档页面所说的(https://react-query.tanstack.com/guides/dependent-queries):调用您需要的所有 useQuery 挂钩,但发送“启用:false”直到数据第一个正确接收。
否则有点复杂,因为一个组件总是必须以相同的顺序调用相同的钩子。所以在 if 语句之后你不能调用更多的钩子。
另一种解决方案是将您的代码拆分为更小的组件,每个组件都有一个 useQuery 调用。在这种情况下,您可以大致将 finalList.map()
函数中的所有内容拆分到它自己的组件中,然后可以对 useQuery 进行第二次调用以获取子类别。等等。起初看起来很奇怪,但很高兴它产生了非常紧凑的组件。
但是,React Query 推荐启用标志本身。
我在制作一些 useQuery 链式获取数据时遇到问题,我已经询问过但无法正常工作,
有一个类别列表,我想从 API 中获取,axios.get("categories") 然后我想根据类别列表获取子类别:axios.get("tutorials/{categoriesName}")
我想使用 UseQuery 挂钩,这样我就可以处理缓存并停止不必要的重新渲染,我已经用简单的 useEffect 完成了这个,但是网站渲染速度太慢所以我想学习 useQuery 方法,
function AllCategories() {
const { isLoading, error, data, isFetching } = useQuery("categories", () =>
axios.get("/categories").then((res) => res.data)
);
console.log(data);
if (isLoading) return "Loading...";
if (error) return "An error has occurred: " + error.message;
//there are like 5 MAIN categories which i have used useQuery to fetch and handle Caching ,
//here i want to get the subcategories from each Main Category , can i chain useQueries ?
return (
<div>
{data.map((item) => {
return <div>{item.name}</div>;
})}
<div>{isFetching ? "Updating..." : ""}</div>
<ReactQueryDevtools initialIsClose />
</div>
);
}
export default AllCategories;
我不知道解决这个问题的正确方法,因为 none 的例子有多个依赖的 useQueries 链接,我不确定即使这是可能的,
澄清一下,我想像这样在 Ui 中呈现数据:PartentCategoryA..subCategorya .PartentCategoryB..subCategoryb PartentCategoryC..subCategoryc 而不是 PartentCategoryA.PartentCategoryB PartentCategoryC .subCategorya ...subCategoryb ..subCategoryc 这就是使这项任务比应有的更难的原因
这是没有 reactQuery 的:
export default function AllCategoriesPage() {
const [categories, setCategories] = useState([]);
const [finalList, setFinalList] = useState([]);
useEffect(() => {
axios.get("/categories").then((response) => {
setCategories(response.data);
});
}, [categories.length]);
useEffect(() => {
setFinalList(categories);
categories.map(async (category) => {
await axios
.get(`/categories/${category.name}`)
.then((res) => {
const mysub = res.data;
category.subCategories = mysub;
})
.then(() => {
setFinalList([...categories]);
});
});
}, [categories.length]);
return (
<div className="allCategoriesPage-wrapper">
{finalList.length === 0 && (
<div className="loader-container">
<Loader />
</div>
)}
<div className="allCategoriesPage-container">
{finalList.length > 0 &&
finalList.map((category) => {
return (
<React.Fragment>
<div className="single-category-wrapper-main-cat ">
{category.name}
</div>
{category.subCategories &&
category.subCategories.map((subcategory) => {
return (
<Link to={`/categories/${subcategory.name}`}>
<div className="single-category-wrapper">
{subcategory.name}
<div className="single-category-img-container">
<img
className="single-category-image"
src={`http://localhost:3001/tutorials/${subcategory.name}/avatar`}
></img>
</div>
</div>
</Link>
);
})}
</React.Fragment>
);
})}
</div>
</div>
);
}
提前致谢
一个很好的方法是使用 React Query 的“依赖查询”文档页面所说的(https://react-query.tanstack.com/guides/dependent-queries):调用您需要的所有 useQuery 挂钩,但发送“启用:false”直到数据第一个正确接收。
否则有点复杂,因为一个组件总是必须以相同的顺序调用相同的钩子。所以在 if 语句之后你不能调用更多的钩子。
另一种解决方案是将您的代码拆分为更小的组件,每个组件都有一个 useQuery 调用。在这种情况下,您可以大致将 finalList.map()
函数中的所有内容拆分到它自己的组件中,然后可以对 useQuery 进行第二次调用以获取子类别。等等。起初看起来很奇怪,但很高兴它产生了非常紧凑的组件。
但是,React Query 推荐启用标志本身。