乐闻世界logo
搜索文章和话题

How to sort data in React Query

5 个月前提问
4 个月前修改
浏览次数45

1个答案

1

在 React Query 中进行数据排序不是库本身直接提供的功能,但你可以通过几种方法在获取数据后对数据进行排序。React Query 主要是用于数据获取、缓存和状态更新,排序和其他数据转换可以在数据获取之后处理。下面是一些实现数据排序的方法:

方法一:在 useQuery 之后使用 JavaScript 的数组排序方法

最直接的方法是在数据被成功获取并返回后,使用 JavaScript 的原生排序方法,比如 Array.prototype.sort(),来对结果进行排序。例如:

javascript
import { useQuery } from 'react-query'; function useSortedTodos() { const { data: todos, ...rest } = useQuery('todos', fetchTodos); // 对 todos 进行排序,假设我们根据 title 属性升序排序 const sortedTodos = todos?.slice().sort((a, b) => a.title.localeCompare(b.title)); return { data: sortedTodos, ...rest }; }

在这个例子中,我们首先使用 useQuery 获取 todos。一旦数据被 fetch 并缓存,我们将数据复制并排序,然后再将排序后的数据返回。注意我们使用 slice() 来创建原数组的副本,这是因为 sort() 方法会直接在原数组上进行操作,这可能影响 React 的状态管理。

方法二:在数据源上排序

如果可能的话,更有效的方法是在服务器端或者在获取数据的函数中进行排序,这样可以减少前端的处理负担,并且可以利用数据库等后端服务的排序功能。

javascript
// 假设 fetchTodos 接受一个参数来指定排序方式 function fetchTodos(sortBy = 'title') { return fetch(`/api/todos?sortBy=${sortBy}`).then(res => res.json()); } function Todos() { const { data: todos, isLoading } = useQuery(['todos', { sortBy: 'title' }], ({ queryKey }) => fetchTodos(queryKey[1].sortBy)); return ( <div> {isLoading ? ( <div>Loading...</div> ) : ( todos.map(todo => <div key={todo.id}>{todo.title}</div>) )} </div> ); }

在这个例子中,我们修改了 fetchTodos 函数以接受一个 sortBy 参数,并在请求的 URL 中使用这个参数。这样,数据在到达前端之前就已经被排序。

方法三:使用自定义钩子封装排序逻辑

为了复用和保持组件的整洁,你可以创建一个自定义钩子来封装排序逻辑:

javascript
import { useQuery } from 'react-query'; function useSortedTodos(sortBy = 'title') { const { data: todos, ...rest } = useQuery('todos', fetchTodos); // 排序逻辑 const sortedTodos = React.useMemo(() => { return todos?.slice().sort((a, b) => a[sortBy].localeCompare(b[sortBy])); }, [todos, sortBy]); return { data: sortedTodos, ...rest }; }

在这个自定义钩子中,我们使用了 React.useMemo 来避免在每次渲染时都重新排序,只有当 todossortBy 改变时才重新排序。

结论

虽然 React Query 自身不直接支持排序操作,通过上述几种方法,你可以灵活地在获取数据后对数据进行排序处理,以满足具体的业务需求。在实际应用中,选择最合适的方法取决于具体的需求和上下文。在使用 React Query 进行数据的管理时,React Query 本身不直接提供数据排序的功能。React Query 的主要功能是数据的获取、缓存和更新,而不涉及如何对数据进行处理,例如排序或过滤。但是,我们可以在获取到数据之后,配合 React 的状态管理或其他逻辑来实现排序。

以下是一个简单的例子,展示如何使用 React Query 获取数据后,结合 React 的 useState 和 useEffect 钩子函数来进行数据排序:

javascript
import React, { useState, useEffect } from 'react'; import { useQuery } from 'react-query'; import axios from 'axios'; const fetchProjects = async () => { const { data } = await axios.get('https://api.example.com/projects'); return data; }; const Projects = () => { const { data, isLoading, error } = useQuery('projects', fetchProjects); const [sortedData, setSortedData] = useState([]); // 排序逻辑 useEffect(() => { if (data) { const sorted = [...data].sort((a, b) => { return a.name.localeCompare(b.name); // 假设我们按照项目名称进行排序 }); setSortedData(sorted); } }, [data]); if (isLoading) return <div>Loading...</div>; if (error) return <div>An error occurred: {error.message}</div>; return ( <div> <h1>Projects</h1> <ul> {sortedData.map(project => ( <li key={project.id}>{project.name}</li> ))} </ul> </div> ); }; export default Projects;

在这个例子中,我们使用了 useQuery 钩子从后端 API 获取数据。获取到的数据通过 data 变量访问。然后我们使用了 useStateuseEffect 钩子来对数据进行排序。我们首先在 useState 中初始化 sortedData 为空数组,当 data 更新时,useEffect 被触发,我们将 data 复制并排序,最后使用 setSortedData 更新状态。

这样处理的好处是,数据获取和数据处理(排序)被清晰地分离,使得组件易于维护和理解。此外,React Query 的缓存和数据更新机制依然能够有效地工作,而不会因为排序逻辑的加入而受到影响。

2024年6月29日 12:07 回复

你的答案