添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
乐闻世界logo
搜索文章和话题

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

4 个月前 提问
2 天前 修改
浏览次数 28

8 个答案

1
2
3
4
5
6
7
8

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

设计目的 :

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

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

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

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

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

  • 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 ( {data.map(user => ( <li key={user.id}>{user.name}</li> ))} 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月24日 20:01 回复

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

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

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

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

    2024年6月23日 14:09 回复

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

    这就是react-query 的闪光点。

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

    这就是 redux 的闪光点

    2024年6月23日 14:09 回复

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

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

    2024年6月23日 14:09 回复

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

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

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

    2024年6月23日 14:09 回复

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

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

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

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

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

    设计目的 :

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

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

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

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

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

  • 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月23日 14:09 回复

    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,可以帮助开发者追踪状态的变化和行为的派发。
  • 主要区别

  • 用途 :React Query主要用于数据同步,而Redux用于全局状态管理。
  • 数据管理 :React Query内置了数据获取和缓存的机制,而Redux需要开发者手动管理数据请求和响应结果。
  • 状态同步 :React Query提供自动的数据同步机制,Redux则需要结合额外的库(如redux-thunk或redux-saga)来处理异步逻辑。
  • 配置 :React Query减少了配置和样板代码的需要,Redux则需要更多的样板代码和配置步骤。
  • 开发体验 :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 ( {data.map(user => ( <li key={user.id}>{user.name}</li> ))} 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';