首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

我是redux和react的新手,我正在尝试更新REDUX存储中的嵌套状态,但无法对其进行排序

Redux 是一个用于 JavaScript 应用的状态容器,它提供了一种可预测的方式来管理应用的状态。React 是一个用于构建用户界面的 JavaScript 库。结合使用 Redux 和 React 可以帮助你管理复杂的应用状态。

基础概念

Redux 存储(Store):存储应用的所有状态。 Reducer:纯函数,接收当前状态和一个动作(Action),返回新的状态。 Action:描述发生了什么的简单对象。 Selector:从 Redux 存储中提取数据的函数。

更新嵌套状态

更新嵌套状态时,通常需要使用一些辅助工具,如 immer 或者 lodash/fp,来简化不可变数据的操作。

排序

排序通常涉及到对数组中的元素进行重新排列。在 Redux 中,你需要创建一个动作来触发排序,并在 reducer 中实现排序逻辑。

示例代码

假设我们有一个嵌套的状态结构,其中有一个 items 数组,我们想要根据某个属性(比如 id)来对这个数组进行排序。

Action

代码语言:txt
复制
// actions.js
export const SORT_ITEMS = 'SORT_ITEMS';

export const sortItems = () => ({
  type: SORT_ITEMS
});

Reducer

代码语言:txt
复制
// reducer.js
import { produce } from 'immer';
import { SORT_ITEMS } from './actions';

const initialState = {
  items: [
    { id: 3, name: 'Item C' },
    { id: 1, name: 'Item A' },
    { id: 2, name: 'Item B' }
  ]
};

const reducer = (state = initialState, action) => {
  switch (action.type) {
    case SORT_ITEMS:
      return produce(state, draft => {
        draft.items.sort((a, b) => a.id - b.id);
      });
    default:
      return state;
  }
};

export default reducer;

使用 Redux 和 React

代码语言:txt
复制
// App.js
import React from 'react';
import { useSelector, useDispatch } from 'react-redux';
import { sortItems } from './actions';

const App = () => {
  const items = useSelector(state => state.items);
  const dispatch = useDispatch();

  return (
    <div>
      <button onClick={() => dispatch(sortItems())}>Sort Items</button>
      <ul>
        {items.map(item => (
          <li key={item.id}>{item.name}</li>
        ))}
      </ul>
    </div>
  );
};

export default App;

应用场景

  • 复杂应用的状态管理:当你的 React 应用变得复杂,组件间的状态共享变得困难时,Redux 可以帮助你集中管理状态。
  • 状态历史追踪:Redux 的中间件如 Redux DevTools 可以帮助你追踪状态的变化历史。
  • 性能优化:通过合理地分割 reducer 和使用 useSelector 的浅比较功能,可以避免不必要的组件重新渲染。

遇到的问题及解决方法

如果你在尝试更新嵌套状态时遇到问题,可能是因为直接修改了状态对象,这在 Redux 中是不允许的。确保你使用了不可变数据操作的方法,如 immer 或者扩展运算符(...)来创建状态的副本。

如果你在排序时遇到问题,检查你的比较函数是否正确。确保它返回一个数值,表示两个元素的相对顺序。

优势

  • 可预测性:Redux 的状态更新是可预测的,因为所有的状态变化都是通过纯函数(reducers)来实现的。
  • 可维护性:通过将状态分割成多个小的 reducer,你可以更容易地理解和维护复杂的状态逻辑。
  • 调试友好:Redux DevTools 提供了强大的调试功能,可以帮助你追踪状态的变化。

通过上述方法,你应该能够成功地在 Redux 中更新嵌套状态并进行排序。如果你遇到具体的错误或问题,请提供更多的信息以便进一步帮助解决。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

设计师都能懂的 Redux 指南

请不要用 Google 搜索 花哨的后端的东西 我听说过它,但我不知道它是什么,这可能是一个 React 框架 是一种在 React 应用中存储管理状态的更好方式 这个问题,我问过 40 多位设计师,以上是他们的经典回答...他们中的许多人都知道 Redux 与React 一起工作,它的工作是状态管理。 本文的目的就是让你对 Redux 有更全面的认知: 它能做什么?为什么它要这样设计?何时使用它?...你们很多人可能都听说过,它的工作是状态管理。稍后我将解释状态管理的含义, 此刻,我只能想让你看下面这张图: 为什么要了解 Redux Redux 更多的是关于应用程序的内部工作而不是它的外观和感受。...例如,如果用户向Dribbble shot添加评论或点赞,我们需要更新相应的 HTML。 协调状态的这三个方面是前端开发的重要组成部分,React 对这项任务有不同程度的支持。...但 React 正在快速着手解决这些问题!事实上,Redux 的作者 Dan Abramov 在几年前已经加盟 Facebook 的 React 核心团队。

1.7K10

从设计的角度看 Redux

请不要用 Google 搜索 花哨的后端的东西 我听说过它,但我不知道它是什么,这可能是一个 React 框架 是一种在 React 应用中存储管理状态的更好方式 这个问题,我问过 40 多位设计师,以上是他们的经典回答...他们中的许多人都知道 Redux 与React 一起工作,它的工作是状态管理。 本文的目的就是让你对 Redux 有更全面的认知: 它能做什么?为什么它要这样设计?何时使用它?...例如,如果用户向Dribbble shot添加评论或点赞,我们需要更新相应的 HTML。 协调状态的这三个方面是前端开发的重要组成部分,React 对这项任务有不同程度的支持。...但 React 正在快速着手解决这些问题!事实上,Redux 的作者 Dan Abramov 在几年前已经加盟 Facebook 的 React 核心团队。...Redux 不只是为 React 而生 一个常见的误解是 Redux 仅用于 React。 听起来Redux在没有React的情况下无法做任何事情。

1.7K30
  • 2016 JavaScript 技术栈展望

    好在这一现象正在退热,优胜劣汰,优秀的项目慢慢沉淀下来,开发方式也越来越清晰。有些开发者正在尝试使用基于上述技术的框架进行开发,也在一定程度上减少了学习成本。...在 Redux 中,大多数的组件都是纯函数式的组件,也只有一个集中的存储和资源中心。Redux 的实例方法负责整个数据的操作和维护。相比 Flux 来说,Redux 的思路更加清晰。...就我个人的角度而言,在前端开发中类型系统并不是至关重要的一环(此处可能有争议)。在类型系统更加健壮且对 Babel 更友好之前,还是让我们静观其变吧。...我喜欢 Chai 断言是因为其种类丰富、功能齐全的插件,喜欢 Mocha 是因为其对异步的良好支持。强烈建议使用 Dirty Chai 避免某些问题。...我不认为上述有一个完美的解决方案,但我对 API 有一个自己的认知: 可预测,遵循一致性协议 支持在一次查询中获取多个实体 支持更新操作 易于调试 易于使用 到目前为止,我还没有发现满足上述所有条件的解决方案

    2.1K40

    Zustand:让React状态管理更简单、更高效

    在React项目开发中,状态管理一直是一个绕不开的话题。很多人提到状态管理,第一时间会想到Redux。...Zustand凭借其简洁的API、低学习曲线和对TypeScript的无缝支持,成为了众多选项中的热门之选。 但是,你可能还不太熟悉Zustand。...无论是对于追求性能的高级开发者,还是希望简化开发流程的新手,Zustand都是一个值得尝试的选择。...Zustand的优势不仅仅在于其轻量级和简单性,还包括其能够轻松集成进现有的React应用中,以及它为现代React开发模式(如函数组件和Hooks)提供的天然支持。...它的设计理念和易用性使得它成为当前React生态中不可忽视的一员,值得每一位React开发者探索和尝试。

    1.3K10

    2023再谈前端状态管理

    Class 时代 Redux Redux 的灵感来源于 Flux 架构和函数式编程原理,状态更新可预测、可跟踪,提倡使用「单一存储」。这通常会「导致将所有的东西存储在一个大的单体存储中」。...React 通过提供机制把应用状态转换为可渲染组件树并对其进行渲染。而MobX提供机制来存储和更新应用状态供 React 使用。...Mobx的优势是写法简单和高性能,但状态的可维护性不如redux,在并发模式中的兼容性也有待观察。...基于观察者/可观察模式,内部对通过 state 绑定的组件,添加到了订阅者队列,store中的属性相当于一个被观察者,当属性状态变更后,通知所有订阅了该数属性的组件进行更新 利用 Proxy 自动进行重新渲染优化...React 状态管理工具:我是这样选择的 You Might Not Need Redux 各流派 React 状态管理对比和原理实现 盘点React常见的状态管理方式 2022 年,我们再来谈谈 React

    95610

    【19】进大厂必须掌握的面试题-50个React面试

    为了方便您访问,我对React面试问题进行了归类: React一般面试问题 反应组件面试问题 React Redux面试问题 React Router面试问题 一般React –...因此,元素无法直接更新其状态,并且其提交由JavaScript函数处理。此功能可以完全访问用户输入到表单中的数据。...它们通过回收DOM中的所有现有元素来帮助React优化渲染。这些键必须是唯一的数字或字符串,React只能使用这些数字或字符串对元素进行重新排序,而不是重新渲染它们。这导致应用程序性能的提高。...Flux是强制单向数据流的体系结构模式。它控制派生的数据,并使用具有对所有数据的权限的中央存储实现多个组件之间的通信。整个应用程序中的任何数据更新都只能在此处进行。...41.在Redux中如何定义动作? React中的动作必须具有type属性,该属性指示正在执行的ACTION的类型。必须将它们定义为String常量,您也可以为其添加更多属性。

    11.2K30

    React组件设计实践总结05 - 状态管理

    比如: 你需要持久化应用状态, 这样你可以从本地存储或服务器返回数据中恢复应用 需要实现撤销重做这些功能 实现跨页面的用户协作 应用状态很复杂时 数据流比较复杂时 许多不相关的组件需要共享和更新状态 外置状态...Redux 官方推荐范式化 State,扁平化结构树, 减少嵌套,减少数据冗余. 也就是倾向于更方便被更新和存储,至于视图需要什么则交由 reselect 这些库进行计算映射和组合...., 我只能尝试解释一下我对分形的理解: 前面文章也提到过‘分离逻辑和视图’和‘分离容器组件和展示组件’,这两个规则都来自于 Redux 的最佳实践。...Mobx 也推荐不要在状态中放置冗余或可推导的数据,而是使用 @computed 计算衍生的状态. computed 的概念类似于 Redux 中的 reselect,对范式化的数据进行反范式化或者聚合计算...对 mobx 耦合较深, 日后切换框架或重构的成本很高 兼容性. mobx v5 后使用 Proxy 进行重构, 但 Proxy 在 Chrome49 之后才支持.

    2.2K31

    Redux助力美团点评前端进阶之路

    摘要 都说Redux好,但Redux到底好在哪,它真的解决了业务中遇到的问题吗? 因为在业务中引入Redux而带来的额外成本是否让你苦恼过? 会不会是我们打开Redux的方式不对?...本次分享将主要介绍美团点评以React+Nodejs全栈开发为背景,对redux的模块化尝试与思考。 ?...所有被试图更新的操作都靠刷新完整页面来进行。浏览器维护的history通过记录UI变化来维护不同状态的切换,最典型的使用场景就是浏览器提供的前进后退按钮。...当我第一次看到Redux文档的时候我好像突然顿悟了,但当我第一次写Redux应用的时候,我的内心是崩溃的。 ? Redux在处理异步这方面也是有问题的。...所以我觉得Redux不适合直接用于生产环境。 因此,我觉得我们需要一款框架对Redux进行封装和约束。 duxjs duxjs是一个可用于生产环境的、基于React+Redux的前端框架。

    1.5K40

    前端react面试题(边面边更)

    其状态state是在constructor中像初始化组件属性一样声明的。...适用observable保存数据,数据变化后自动处理响应的操作redux使用不可变状态,这意味着状态是只读的,不能直接去修改它,而是应该返回一个新的状态,同时使用纯函数;mobx中的状态是可变的,可以直接对其进行修改...中有更多的抽象和封装,调试会比较困难,同时结果也难以预测;而redux提供能够进行时间回溯的开发工具,同时其纯函数以及更少的抽象,让调试变得更加的容易React 中的高阶组件运用了什么设计模式?...但其子组件会触发正常的生命周期方法,包括 shouldComponentUpdate() 方法。如果标记发生变化,React 仍将只更新 DOM。...当然,实质上 React 的源码里不是数组,是链表。这些限制会在编码上造成一定程度的心智负担,新手可能会写错,为了避免这样的情况,可以引入 ESLint 的 Hooks 检查插件进行预防。

    1.3K50

    2023 React 生态系统,以及我的一些吐槽……

    服务器状态管理 tanstack query TanStack Query(前身为 React Query)经常被描述为 Web 应用程序中缺失的数据获取库,但更具技术性的说法是,它使得在 Web 应用程序中获取...这通常意味着将基于组件的状态和副作用凑合在一起,或者使用更通用的状态管理库在应用程序中存储和提供异步数据。 虽然大多数传统的状态管理库非常适合处理客户端状态,但在处理异步或服务器状态时效果不佳。...首先,服务器状态具有以下特点: 以你无法控制或拥有的远程位置持久存储 需要使用异步 API 进行获取和更新 暗示共享所有权,并且可能被其他人在你不知情的情况下更改 如果不小心处理,可能会在应用程序中变得...这在实现当今应用程序中使用的其他行为时变得更加复杂: 跟踪加载状态以显示 UI 加载指示器 避免对相同数据进行重复请求 进行乐观更新以提高 UI 响应速度 随着用户与 UI 进行交互,管理缓存的生命周期...最后,我们结合设计稿进行 UI 还原,对编写自定义样式,最终就能实现一个全新数字加减器组件了; 动画 React Spring React Spring 是一个用于构建交互式,数据驱动和动画 UI 组件的库

    78330

    45. 精读《Reacts new Context API》

    原因是这些全局状态管理工具接管了自己的组件更新时机,纵使保留组件原本的更新机制,但当数据流发生变化时,需要绕过一切阻碍,直接触发目标组件的一整套渲染生命周期。...是否还需要 redux 正如很多人说的,这要看我们是怎么使用 redux 了。 在之前一篇精读 前端数据流哲学 中,我提到了 redux、mobx、rxjs 这三大流派的竞争力。...其中 redux 其实是最没有竞争力的数据流框架,我们暂且抛开函数式和优雅性不说,从功能上说,看看 redux 到底做了啥?利用 react 特性,利用全局数据流解决组件间数据通信问题。...再看 mobx,稍微好一点,其主打能力是自动追踪变量引用,当变量被修改时自动刷新视图,可见它的竞争力不仅仅在组件数据的打通,自动绑定带来的效率提升是一大亮点。...举个例子,国际化参数可以让组件一层一层透传,但调用到 node_modules 组件时,我们无法修改其 dom 结构,怎么让这个参数强制透传呢?

    48030

    精读《入坑React前没有人会告诉你的事》

    本期精读的文章是一个组合: 一篇是 Gianluca Guarini 写的 《Things nobody will tell you about React.js》,我将它译作 《那些入坑 React...前没有人会提醒你的事》,因为作者行文中明显带着对 React 的批判和失望。...2 内容概要 Gianluca Guarini 着重吐槽的点在于: React 项目文件组织规范不统一,社区中 Starter Kit 太多(100+),新手不知道该怎么组织文件 由于 React 只关心...View 层,开发者就要面临选择 mobx 还是 redux 的纠结,无论选择哪种都会带来一系列的问题(重新配置构建脚本,更新 eslint 规则等) 如果选了 mobx,会发现 mobx 无法保证自己的...,因为 React Router 几乎是社区中唯一的选择,但是这货版本更新太快,一不小心就用了废弃的 API 用 JSX 的时候总是要嵌很多没必要的 div 或 span 要上手一个 React 应用,

    63110

    前端高频react面试题

    当然,实质上 React 的源码里不是数组,是链表。这些限制会在编码上造成一定程度的心智负担,新手可能会写错,为了避免这样的情况,可以引入 ESLint 的 Hooks 检查插件进行预防。...=id0的值也是1因为子元素相同,就不删除并更新,只做移动操作,这就提升了性能Redux 状态管理器和变量挂载到 window 中有什么区别两者都是存储数据以供后期使用。...在 React 得到元素树之后,React 会自动计算出新的树与老树的节点差异,然后根据差异对界面进行最小化重渲染。...中,每次进入页面判断sessionStorage中有没有存储的那个值,有,则读取渲染数据;没有,则说明数据是初始化的状态。...对新旧两棵树进行一个深度优先遍历,这样每一个节点都会一个标记,在到深度遍历的时候,每遍历到一和个节点,就把该节点和新的节点树进行对比,如果有差异就放到一个对象里面遍历差异对象,根据差异的类型,根据对应对规则更新

    3.4K20

    如何在 React 应用中使用 Hooks、Redux 等管理状态

    值得一提的是,在 React 应用程序中的并非所有组件都必须具有状态,也有无状态组件,它们只呈现其内容而无需存储任何信息,这也很好。...每次我们对先前的状态执行更新时,我们都应该使用这种方法。 管理规模和复杂性 到目前为止,状态管理似乎是小菜一碟。我们只需要一个 hook、一个值和一个函数来更新它,我们就可以开始了。...导入 hook 开始:import { useReducer } from 'react' 然后我们将声明一个 reducer 函数,将接收当前的状态和对其执行的动作(action)作为参数。...Redux toolkit Redux toolkit 是一个建立在 Redux 之上的库,其目的是去除 Redux 产生的一些复杂性和模板。...Recoil 仍然是一种实验性的,并没有被广泛使用,但你可以看到世界各地的开发人员将如何转向这个工具。 Jotai Jotai 是一个为 React 构建的开源状态管理库,其灵感来自 Recoil。

    8.5K20

    怎样通过读源码提高你的 JavaScript 知识

    通过创建描述用户界面未来状态的新树,然后将其与旧树中的对象进行比较来执行更新。 之前我已经在各种文章和教程中读到过这些内容,虽然很有帮助,但是在程序的上下文中能够观察它对我来说是非常有启发性的。...另一个好处是增加你对良好应用架构的理解。虽然大多数开源项目通常与其存储库遵循相同的结构,但每个项目都包含差异。...阅读源代码的技巧 有很多方法可以处理源代码。我发现最简单的方法是,从你选择的库中挑选一种方法,并去记录调用它时会发生什么。不是去记录每一步,而是要尝试确定其整体流程和结构。...如果没有对代码进行深入研究,我会正在处理的项目中打开 /node_modules 文件夹,或者转到 GitHub 存储库。当我遇到错误或有趣的功能时,通常会发生这种情况。...形成一个假设,然后进行测试。 案例研究:Redux的 Connect 函数 React-Redux 是一个用于管理 React 应用状态的库。

    95020

    React高频面试题合集(二)

    这是一个发生在渲染函数被调用和元素在屏幕上显示之间的步骤,整个过程被称为调和。React中的状态是什么?它是如何使用的状态是 React 组件的核心,是数据的来源,必须尽可能简单。...解答如果您尝试直接改变组件的状态,React 将无法得知它需要重新渲染组件。通过使用setState()方法,React 可以更新组件的UI。另外,您还可以谈谈如何不保证状态更新是同步的。...如果需要基于另一个状态(或属性)更新组件的状态,请向setState()传递一个函数,该函数将 state 和 props 作为其两个参数:this.setState((state, props) =>...缓存了store tree中state的状态,通过当前state状态 和变更前 state 状态进行比较,从而确定是否调用 this.setState()方法触发Connect及其子组件的重新渲染Redux...所以,react很方便和其他平台集成react中key的作用简单的说:key 是虚拟DOM中的一种标识,在更新显示是key起到了极其重要的作用复杂的说:当状态中的数据发生改变的时候,react会根据【新数据

    1.3K30

    关于前端面试你需要知道的知识点

    中props.children和React.Children的区别 在React中,当涉及组件嵌套,在父组件中使用props.children把所有子组件显示出来。...React-intl是雅虎的语言国际化开源项目FormatJS的一部分,通过其提供的组件和API可以与ReactJS绑定。...可以使用自定义事件通信(发布订阅模式) 可以通过redux等进行全局状态管理 如果是兄弟组件通信,可以找到这两个兄弟节点共同的父节点, 结合父子间通信方式进行通信。...来担任,store只做存储,中间人,当Reducers的更新完成以后会通过store的订阅来通知react component,组件把新的状态重新获取渲染,组件中也能主动发送action,创建action...很多时候你会使用数据中的 IDs 作为 keys,当你没有稳定的 IDs 用于被渲染的 items 时,可以使用项目索引作为渲染项的 key,但这种方式并不推荐,如果 items 可以重新排序,就会导致

    5.4K30

    Mobx与Redux的异同

    因为关联的状态多,传递复杂,很容易出现像某个组件莫名其妙的更新或者不更新的情况,异常排查也会困难重重。...目前通常的解决方案是引入状态管理库,比如Mobx或Redux,Mobx与Redux都是用来管理JavaScript应用的状态的解决方案,用以提供在某个地方保存状态、修改状态和更新状态,使我们的应用在状态与组件上解耦...对于Mobx与Redux的异同这个问题,是我最近在找实习的时候遇到的,分别为react mobx与react redux作简单的示例,文中的示例代码都在https://codesandbox.io/s/...在Mobx则通常按模块将应用状态划分,在多个独立的store中管理。 储存数据形式 Redux默认以JavaScript原生对象形式存储数据,这也就使得Redux需要手动追踪所有状态对象的变更。...Mobx状态对象通常是可变的Mutable,可以直接使用新值更新状态对象。 状态调试 Redux提供进行时间回溯的开发工具,同时纯函数以及更少的抽象,让调试变得更加容易。

    94120

    百度前端一面高频react面试题指南_2023-02-23

    如果一个元素节点在前后两次更新中跨越了层级,那么 React 不会尝试复用它 两个不同类型的元素会产生出不同的树。...进行比较,递归找出有变化的dom节点,然后对其进行更新操作。..., callback)中的callback拿到更新后的结果 setState 的批量更新优化也是建立在“异步”(合成事件、钩子函数)之上的,在原生事件和setTimeout 中不会批量更新,在“异步”中如果对同一个值进行多次...setState,setState的批量更新策略会对其进行覆盖,取最后一次的执行,如果是同时setState多个不同的值,在更新时会对其进行合并批量更新 描述事件在 React中的处理方式。...思想的实现,但其并不足以替代 Redux,可以理解成一个组件内部的 redux: 并不是持久化存储,会随着组件被销毁而销毁; 属于组件内部,各个组件是相互隔离的,单纯用它并无法共享数据; 配合useContext

    2.9K10

    回望过去,展望未来- 2024 React 生态一览表

    「状态容器(State Container):」 状态容器是存储和管理应用状态的对象。在一些流行的前端框架和库中,如 Redux(React)、Vuex(Vue),都提供了状态容器的实现。...这些状态容器提供了一种集中管理状态的机制,使得状态的变更和访问更加可控。 「动作(Action):」 动作是指对状态进行更改的指令。...它简化了进行 API 请求、缓存数据以及以可预测和高效的方式更新状态的过程。RTK Query 与 Redux 无缝集成,非常适合在状态管理中使用 Redux 的应用程序。...它允许我们检查 React 组件层次结构,查看组件的状态和属性,甚至对组件的状态进行更改以进行测试。...Redux DevTools[33] 是另一个 Chrome 扩展,可增强我们的 Redux 开发工作流程。它提供了对 Redux 存储的洞察,允许我们检查操作和状态更改,回溯和重放操作等。

    74010
    领券