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

React Query和 Redux 之间的主要区别是什么?

9 个月前提问
5 个月前修改
浏览次数115

8个答案

1
2
3
4
5
6
7
8

React Query 和 Redux 是两个用于在React应用程序中管理状态的库,但它们的关注点和使用场景有一些显著的区别。

  1. 设计目的:

    • React Query 是专门为处理异步数据(服务器状态)而设计的,比如从API检索数据、缓存数据以及数据同步。
    • Redux 是一个更通用的状态管理库,它为JavaScript应用提供了一个可预测的状态容器,可以用来管理应用的客户端状态(UI状态)。
  2. 数据缓存和失效:

    • React Query 内建了数据缓存和自动失效的机制。它能够自动地在后台重新获取数据,以及在数据变得过时时标记它们。
    • Redux 本身并不直接提供这些功能。要在Redux中实现数据缓存和失效,通常需要额外的中间件或手动实现相应的逻辑。
  3. 数据同步和更新:

    • React Query 提供了一套内置的工具来处理数据的查询、突变(mutations)、更新和同步,这样在使用时只需要少量的样板代码。
    • Redux 需要手动管理数据同步和更新,通常涉及到编写action、reducer以及使用中间件来处理异步逻辑,这可能会导致较多的样板代码。
  4. 配置和样板代码:

    • React Query 的使用通常更简洁,它提供了hooks,如useQueryuseMutation,这些API可以让你直接在组件中发起数据请求。
    • Redux 的配置和使用相对复杂,特别是在项目初始搭建时。你需要定义actions、reducers、创建store等,虽然Redux Toolkit可以帮助减少一些样板代码。
  5. 开发哲学:

    • React Query 倾向于提供一种简化的方式来处理服务器状态,它鼓励你直接从组件内部加载数据,而不需要将所有的数据都放到全局状态管理中。
    • Redux 遵循Functional Programming的原则,通过使用纯函数(reducers)和不可变数据来管理和更新状态,这样可以更容易地跟踪状态的变化和进行时间旅行调试。
  6. 社区和生态:

    • React Query 在异步数据管理方面很受欢迎,但是它的生态相较于Redux来说较小,因为它比较专注于数据获取和缓存。
    • Redux 有一个庞大的社区和生态系统,包括许多中间件和附加库,如redux-thunk, redux-saga, reselect, redux-form等。

例子:

假设你的应用需要从一个REST API获取用户列表,并且你希望显示的数据是最新的。使用React Query,你可以这样做:

jsx
import { useQuery } from 'react-query'; function UsersComponent() { const { data, error, isLoading } = useQuery('users', fetchUsers); // Render your UI based on the data, error, and loading state... }

在这个例子中,fetchUsers是一个异步函数,它向API请求数据。useQuery会自动处理数据的加载、缓存、重载和更新。

而在Redux中,你可能需要创建actions和reducers来处理异步请求,并使用例如redux-thunk的中间件来处理异步逻辑:

jsx
import { useDispatch, useSelector } from 'react-redux'; function UsersComponent() { const dispatch = useDispatch(); const { users, error, isLoading } = useSelector(state => state.users); useEffect(() => { dispatch(fetchUsers()); }, [dispatch]); // Render your UI based on the users, error, and loading state... React QueryRedux 是两种不同类型的库,它们在React应用程序中承担着不同的角色。 **React Query** 是一个用于数据获取、缓存、同步和更新的库。它专注于处理异步数据操作,如从API检索数据、缓存结果以及自动重新获取数据。以下是React Query的一些关键特点: - **自动缓存和无效化**:React Query自动缓存每次请求的结果,并在数据变化时提供重新获取数据的机制。 - **后台同步**:支持在数据变化或用户与应用程序互动时,自动在后台更新数据。 - **查询状态**: React Query 提供了丰富的状态信息,包括加载状态、错误状态、数据状态等,方便在UI中展示。 - **最小的全局状态管理**:React Query的目标是用最小的配置管理服务器状态。 **Redux** 是一个为JavaScript应用程序提供可预测状态容器的库,特别适合在React中使用。它主要用于管理和维护应用程序的全局状态,并提供一种模式来更新和访问这个状态。以下是Redux的一些关键特点: - **全局状态管理**:Redux提供单一的全局状态树,所有状态的变化都通过派发行为(action)和归约器(reducers)的方式来管理。 - **可预测性**:因为所有的状态变化都遵循一个明确的流程,所以应用程序的行为是可预测的。 - **中间件**:Redux 支持使用中间件来扩展其功能,比如异步调用、日志记录等。 - **开发工具**:Redux拥有强大的开发工具,如Redux DevTools,可以帮助开发者追踪状态的变化和行为的派发。 **主要区别** 1. **用途**:React Query主要用于数据同步,而Redux用于全局状态管理。 2. **数据管理**:React Query内置了数据获取和缓存的机制,而Redux需要开发者手动管理数据请求和响应结果。 3. **状态同步**:React Query提供自动的数据同步机制,Redux则需要结合额外的库(如redux-thunk或redux-saga)来处理异步逻辑。 4. **配置**:React Query减少了配置和样板代码的需要,Redux则需要更多的样板代码和配置步骤。 5. **开发体验**:React QueryAPI设计更贴近React的hooks模式,而Redux通常需要遵循特定的设计模式和最佳实践。 例如,如果我们有一个用户列表,并且我们想通过React Query来获取这些用户,我们可能会这样做: ```javascript import { useQuery } from 'react-query'; function Users() { const { isLoading, error, data } = useQuery('fetchUsers', fetchUsersApi); if (isLoading) return 'Loading...'; if (error) return 'An error has occurred: ' + error.message; return ( <ul> {data.map(user => ( <li key={user.id}>{user.name}</li> ))} </ul> ); } async function fetchUsersApi() { const response = await fetch('/api/users'); if (!response.ok) { throw new Error('Network response was not ok'); } return response.json(); }

使用Redux处理相同的数据获取,我们需要编写action creators、reducers以及相应的async action handlers:

javascript
import { createStore, applyMiddleware } from 'redux'; import thunk from 'redux-thunk'; import { Provider, useDispatch, useSelector } from 'react-redux'; // Action types const FETCH_USERS_REQUEST = 'FETCH_USERS_REQUEST'; const FETCH_USERS_SUCCESS = 'FETCH_USERS_SUCCESS'; const FETCH_USERS_FAILURE = 'FETCH_USERS_FAILURE'; // Action creators const fetchUsersRequest = () => ({ type: FETCH_USERS_REQUEST }); const fetchUsersSuccess = users => ({ type: FETCH_USERS_SUCCESS, payload:
2024年6月29日 12:07 回复

React-query 就是所谓的专用库。它为你保存了一个 api 缓存——没有别的。由于它是专门的,因此它可以很好地完成这项工作并且需要更少的代码。

另一方面,Redux 为您提供了几乎可以存储任何内容的工具 - 但您必须编写逻辑。因此,您可以在 Redux 中做更多事情,但您可能必须编写专用库不需要的代码。

您可以并行使用它们:react 查询中的 api 缓存,Redux 中的其余全局状态。

也就是说,官方 Redux Toolkit 从 1.6 版开始还附带了 api 缓存抽象RTK Query,其功能集与 React Query 类似,但总体概念有所不同 - 您可能还想检查一下。

2024年6月29日 12:07 回复

react-query旨在处理存储在远程服务器上的数据。要访问此数据,您的应用程序需要使用异步请求。您可能需要在这里处理缓存、加载状态、网络故障等问题。

这就是react-query 的闪光点。

Redux另一端处理客户端的数据。例如,文本输入的内容或模态的状态。您不需要处理与网络相关的问题。但您确实需要处理复杂的因果序列。

这就是 redux 的闪光点

2024年6月29日 12:07 回复

Reduxreact-query是两个非常不同的东西:react-query用于数据同步,Redux是全局状态管理器。react-query用于将所有应用程序保持同步到同一个数据库,Redux用于将应用程序状态的一部分共享给需要读取该状态的所有组件。

举个例子:我有一个可以与其他用户聊天的应用程序。我使react-query所有应用程序与用户收到的所有消息保持同步,然后将消息存储在其中,Redux以便在聊天页面和历史聊天页面上显示消息。

2024年6月29日 12:07 回复

React Query 管理服务器状态。它的主要功能是处理Server和Client之间的功能。

Redux 处理客户端状态。Redux 可用于异步存储数据。

因此,它们在不同层面上都有其独特的作用,并且可以同时使用。

2024年6月29日 12:07 回复

我们应该区分两种状态,客户端状态服务器(或远程)状态

  • 客户端状态包含:
    • 本地创建的尚未持久化到服务器的数据。
    • 处理活动路由、选定选项卡、微调器、分页控件等的 UI 状态。
  • 服务器状态是与以下内容相关的所有内容:
    • 数据远程保存,需要异步 API 来获取和更新

当涉及到客户端状态时,Redux是一个用于管理应用程序状态的出色管理工具。

另一方面,为了管理服务器状态,我们可以使用常规状态管理工具,但它们不太擅长处理异步或服务器状态。因此,为了解决这个问题,我们使用React Query。正如他们的文档中所述,React 查询是一个很棒的工具:

  • 缓存...(可能是编程中最难做的事情)
  • 将同一数据的多个请求合并为单个请求
  • 在后台更新“过时”数据
  • 了解数据何时“过时”
  • 尽快反映数据更新
  • 性能优化,例如分页和延迟加载数据
  • 管理服务器状态的内存和垃圾收集
  • 通过结构共享来记忆查询结果
2024年6月29日 12:07 回复

React Query 和 Redux 是两个用于在React应用程序中管理状态的库,但它们的关注点和使用场景有一些显著的区别。

  1. 设计目的:

    • React Query 是专门为处理异步数据(服务器状态)而设计的,比如从API检索数据、缓存数据以及数据同步。
    • Redux 是一个更通用的状态管理库,它为JavaScript应用提供了一个可预测的状态容器,可以用来管理应用的客户端状态(UI状态)。
  2. 数据缓存和失效:

    • React Query 内建了数据缓存和自动失效的机制。它能够自动地在后台重新获取数据,以及在数据变得过时时标记它们。
    • Redux 本身并不直接提供这些功能。要在Redux中实现数据缓存和失效,通常需要额外的中间件或手动实现相应的逻辑。
  3. 数据同步和更新:

    • React Query 提供了一套内置的工具来处理数据的查询、突变(mutations)、更新和同步,这样在使用时只需要少量的样板代码。
    • Redux 需要手动管理数据同步和更新,通常涉及到编写action、reducer以及使用中间件来处理异步逻辑,这可能会导致较多的样板代码。
  4. 配置和样板代码:

    • React Query 的使用通常更简洁,它提供了hooks,如useQueryuseMutation,这些API可以让你直接在组件中发起数据请求。
    • Redux 的配置和使用相对复杂,特别是在项目初始搭建时。你需要定义actions、reducers、创建store等,虽然Redux Toolkit可以帮助减少一些样板代码。
  5. 开发哲学:

    • React Query 倾向于提供一种简化的方式来处理服务器状态,它鼓励你直接从组件内部加载数据,而不需要将所有的数据都放到全局状态管理中。
    • Redux 遵循Functional Programming的原则,通过使用纯函数(reducers)和不可变数据来管理和更新状态,这样可以更容易地跟踪状态的变化和进行时间旅行调试。
  6. 社区和生态:

    • React Query 在异步数据管理方面很受欢迎,但是它的生态相较于Redux来说较小,因为它比较专注于数据获取和缓存。
    • Redux 有一个庞大的社区和生态系统,包括许多中间件和附加库,如redux-thunk, redux-saga, reselect, redux-form等。

例子:

假设你的应用需要从一个REST API获取用户列表,并且你希望显示的数据是最新的。使用React Query,你可以这样做:

jsx
import { useQuery } from 'react-query'; function UsersComponent() { const { data, error, isLoading } = useQuery('users', fetchUsers); // Render your UI based on the data, error, and loading state... }

在这个例子中,fetchUsers是一个异步函数,它向API请求数据。useQuery会自动处理数据的加载、缓存、重载和更新。

而在Redux中,你可能需要创建actions和reducers来处理异步请求,并使用例如redux-thunk的中间件来处理异步逻辑:

jsx
import { useDispatch, useSelector } from 'react-redux'; function UsersComponent() { const dispatch = useDispatch(); const { users, error, isLoading } = useSelector(state => state.users); useEffect(() => { dispatch(fetchUsers()); }, [dispatch]); // Render your UI based on the users, error, and loading state...
2024年6月29日 12:07 回复

React Query 和 Redux 是两种不同类型的库,它们在React应用程序中承担着不同的角色。

React Query 是一个用于数据获取、缓存、同步和更新的库。它专注于处理异步数据操作,如从API检索数据、缓存结果以及自动重新获取数据。以下是React Query的一些关键特点:

  • 自动缓存和无效化:React Query自动缓存每次请求的结果,并在数据变化时提供重新获取数据的机制。
  • 后台同步:支持在数据变化或用户与应用程序互动时,自动在后台更新数据。
  • 查询状态: React Query 提供了丰富的状态信息,包括加载状态、错误状态、数据状态等,方便在UI中展示。
  • 最小的全局状态管理:React Query的目标是用最小的配置管理服务器状态。

Redux 是一个为JavaScript应用程序提供可预测状态容器的库,特别适合在React中使用。它主要用于管理和维护应用程序的全局状态,并提供一种模式来更新和访问这个状态。以下是Redux的一些关键特点:

  • 全局状态管理:Redux提供单一的全局状态树,所有状态的变化都通过派发行为(action)和归约器(reducers)的方式来管理。
  • 可预测性:因为所有的状态变化都遵循一个明确的流程,所以应用程序的行为是可预测的。
  • 中间件:Redux 支持使用中间件来扩展其功能,比如异步调用、日志记录等。
  • 开发工具:Redux拥有强大的开发工具,如Redux DevTools,可以帮助开发者追踪状态的变化和行为的派发。

主要区别

  1. 用途:React Query主要用于数据同步,而Redux用于全局状态管理。
  2. 数据管理:React Query内置了数据获取和缓存的机制,而Redux需要开发者手动管理数据请求和响应结果。
  3. 状态同步:React Query提供自动的数据同步机制,Redux则需要结合额外的库(如redux-thunk或redux-saga)来处理异步逻辑。
  4. 配置:React Query减少了配置和样板代码的需要,Redux则需要更多的样板代码和配置步骤。
  5. 开发体验:React Query 的API设计更贴近React的hooks模式,而Redux通常需要遵循特定的设计模式和最佳实践。

例如,如果我们有一个用户列表,并且我们想通过React Query来获取这些用户,我们可能会这样做:

javascript
import { useQuery } from 'react-query'; function Users() { const { isLoading, error, data } = useQuery('fetchUsers', fetchUsersApi); if (isLoading) return 'Loading...'; if (error) return 'An error has occurred: ' + error.message; return ( <ul> {data.map(user => ( <li key={user.id}>{user.name}</li> ))} </ul> ); } async function fetchUsersApi() { const response = await fetch('/api/users'); if (!response.ok) { throw new Error('Network response was not ok'); } return response.json(); }

使用Redux处理相同的数据获取,我们需要编写action creators、reducers以及相应的async action handlers:

javascript
import { createStore, applyMiddleware } from 'redux'; import thunk from 'redux-thunk'; import { Provider, useDispatch, useSelector } from 'react-redux'; // Action types const FETCH_USERS_REQUEST = 'FETCH_USERS_REQUEST'; const FETCH_USERS_SUCCESS = 'FETCH_USERS_SUCCESS'; const FETCH_USERS_FAILURE = 'FETCH_USERS_FAILURE'; // Action creators const fetchUsersRequest = () => ({ type: FETCH_USERS_REQUEST }); const fetchUsersSuccess = users => ({ type: FETCH_USERS_SUCCESS, payload:
2024年6月29日 12:07 回复

你的答案