使用拆分减速器更新相关状态字段的最佳方法?

2024-02-01

我正在尝试找出更新状态树上的几个顶级字段的理想方法,同时仍然维护拆分减速器。

这是我想出的一个简单的解决方案。

var state = {
  fileOrder: [0],
  files: {
    0:{
      id: 0,
      name: 'asdf'
    }
  }
};

function handleAddFile(state, action) {
  return {...state, ...{[action.id]:{id: action.id, name: action.name}}};
};

function addFileOrder(state, action) {
  return [...state, action.id];
}

// Adding a file should create a new file, and add its id to the fileOrder array.
function addFile(state, action) {
  let id = Math.max.apply(this, Object.keys(state.files)) + 1;
  return {
    ...state,
    fileOrder: addFileOrder(state.fileOrder, {id}),
    files: handleAddFile(state.files, {id, name: action.name})
  };
}

目前我可以发送单个操作{type: ADD_FILE, fileName: 'x'}, then addFile在内部创建一个动作发送到addFileOrder and addFile.

我很好奇这是否被认为是执行以下任一操作的更好方法。

相反,分派两个操作,一个用于添加文件,然后获取它的 id 并分派一个ADD_TO_FILE_ORDER使用 id 进行操作。 或火灾和行动,如{type: ADD_FILE, name: 'x', id: 1},而不是允许addFile计算新的 id。这将允许我使用combineReducers并根据操作类型进行过滤。 这个例子可能很简单,但我的实际状态树有点复杂,添加的每个文件也需要添加到其他实体。

对于一些额外的上下文,更完整的状态树将如下所示。

{
    "fileOrder": [0]
    "entities": {
        "files": {
            0: {
                id: 0,
                name: 'hand.png'
            }
        },
        "animations": {
            0: {
                id: 0,
                name: "Base",
                frames: [0]
            }
        },
        "frames": {
            0: {
                id: 0,
                duration: 500,
                fileFrames: [0]
            }
        },
        "fileFrames": {
            0: {
                id: 0,
                file: 0,
                top: 0,
                left: 0,
                visible: true
            }           
        }
    }
}

添加文件需要:

  1. 将其添加到文件哈希中。
  2. 将其添加到 fileOrder 数组中。
  3. 为每个框架添加一个引用文件的 fileFrame。
  4. 将每个新的 fileFrame 添加到为其创建的框架中。

最后两点让我想知道我是否能够使用combineReducers。


我最终找到了解决这个问题的一个非常简单的方法。

文档中的这两个块在功能上是相同的。

const reducer = combineReducers({
  a: doSomethingWithA,
  b: processB,
  c: c
});

// This is functionally equivalent.
function reducer(state, action) {
  return {
    a: doSomethingWithA(state.a, action),
    b: processB(state.b, action),
    c: c(state.c, action)
  };
}

我最终调整了第二个块,并且总是沿着我的全局状态树传递。只要一路上没有任何东西编辑状态,所有减速器都可以正常工作。

// Simple change to pass the entire state to each reducer.
// You have to be extra careful to keep state immutable here.
function reducer(state, action) {
  return {
    a: doSomethingWithA(state.a, action, state),
    b: processB(state.b, action, state),
    c: c(state.c, action, state)
  };
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用拆分减速器更新相关状态字段的最佳方法? 的相关文章

  • 如何从react-bootstrap复选框获取值/属性?

    我正在尝试使用反应引导复选框 https react bootstrap github io components html forms controls https react bootstrap github io components
  • Redux - 从函数调用操作

    我正在尝试从函数调用 redux 操作 我调用该函数的组件已连接到商店 但是 如果我通过以下操作 它就不起作用 function myFunc action action 有没有办法通过参数传递动作 谢谢 using bindActionC
  • Redux 状态在 mapStateToProps 中未定义

    我目前正在关注this http teropa info blog 2015 09 10 full stack redux tutorial html教程 我遇到了一些障碍mapStateToProps在下面的代码中 import Reac
  • NGXS 状态大小和性能

    Angular 中类似于 redux 的模式给我留下了深刻的印象 并且我迷上了 NGXS 我将其与 NGRX 和 Akita 进行了比较 但选择了 NGXS 我知道 NGXS 存储应用程序中的所有先前状态 因此如果我有一个非常复杂的 UI
  • React + Redux 和 REST API?

    我在 Node 中构建了一个简单的 CRUD 应用程序 并已在 Express 中完成了其余 API 的创建 我现在正在寻求添加前端功能 并希望使用 React Redux 作为学习练习 然而 似乎所有围绕此的教程都直接使用 Redux 访
  • 如何编写具有依赖状态的 redux 减速器

    我正在开发一个 React Redux 应用程序 它允许将 小部件 添加到页面并在 2D 空间中进行操作 要求可以同时选择和操作多个小部件 我当前状态树的简化版本如下所示 widgets widget 1 x 100 y 200 widge
  • 如何使用 useState 挂钩按索引更新数组?

    我有一个选择组件 我想用它来根据索引更新对象数组的值 我这样使用钩子 const areas setAreas useState product areas 这将返回以下 区域 0 de Getraenke en Drinks 1 de S
  • 如何修复 React-Redux 应用程序中的 431 请求标头字段过大

    我正在 YouTube 上使用 Redux 完成 MERN 注册 登录身份验证教程 当尝试在 Postman 中将测试用户 POST 到服务器时 我收到 431 标头请求太大错误响应 我在一些地方读到清除浏览器中的缓存 历史记录是有效的 所
  • 如何实现rtk的createApi查询去抖

    有人可以帮助我使用 creatApi 和 redux 工具包中的查询实现来实现去抖功能 提前致谢 我个人在 RTK 查询中没有发现任何开箱即用的去抖动实现 但你可以自己实现 定义一个api 我正在使用 openlibrary 的一个 imp
  • Redux中如何处理关系数据?

    我正在创建的应用程序有很多实体和关系 数据库是关系型的 为了获得一个想法 有超过 25 个实体 它们之间具有任何类型的关系 一对多 多对多 该应用程序基于 React Redux 为了从商店获取数据 我们使用Reselect https g
  • 如何缓存 API 响应并稍后在 React 和 Redux 中使用它?

    在我的基于 React 的应用程序中 有一个 REST API 调用 它一次性获取整个页面所需的所有数据 响应中包含的数据也可用于下拉菜单中 但我不确定如何实现这一目标 目前 每当选择下拉值时 我都会发出新请求 请建议我如何有效地实施它 而
  • 类型错误:Object(...) 不是react-redux 中的函数

    当我尝试在react redux 中 createStore 时 我收到了这个奇怪的错误 我不知道为什么 因为我之前在不同的应用程序中这样做过 但它工作得很好 TypeError Object is not a function src i
  • 使用 ngrx 时调度完成后执行代码

    在我的示例 Angular 2 应用程序中 我使用 ngrx store 和 ngrx effects 进行状态管理 下面是组件中添加新项目的函数之一 addAuthor this store dispatch addAuthorActio
  • 为什么 React 组件在 props 没有改变的情况下会重新渲染?

    我在 ReactJS 16 8 5 和 React Redux 3 7 2 上构建了一个应用程序 当应用程序加载应用程序安装时 将设置初始存储并针对 Firebase 实时数据库设置数据库订阅 该应用程序包含侧边栏 标题和内容部分 通过使用
  • Redux - 异步加载初始状态

    我正在尝试找出最简洁的方法来加载来自 API 调用的 Redux 存储的初始状态 据我所知 提供初始状态的典型方法是在页面加载时在服务器端生成它 并将其作为简单对象提供给 Redux createStore 但是 我正在编写一个应用程序 计
  • addEventListener 通过映射调度来反应 redux

    我目前正在尝试将事件侦听器添加到我在反应中制作的应用程序 我通过连接到运行的 componentDidMount API 来做到这一点只有一次该组件已渲染 仅此而已 我的问题是我正在使用connect from react redux将我的
  • 浸入草稿,计算属性

    我不确定为什么我会得到Error Immer drafts cannot have computed properties在我的减速器代码中 我在用着redux starter kit它用 Immer 库包装了我的所有减速器代码 我不太确定
  • redux 和 React 中减速器的先前状态

    这是我的减速器的样子 export default function catalogReducer state initialState catalogItems action switch action type case types L
  • redux-observable 中的独立链取消?

    我是 RxJS 新手 在我的应用程序中 我需要独立取消延迟操作 Here s http jsbin com gayoti edit js output一个工作示例 延迟为 3 秒 但是当我选择删除多个项目并取消其中一项时 然后一次全部取消
  • 未捕获的类型错误:this.props.signinUser 不是一个函数(…)

    src actions index js import axios from axios const ROOT URL http localhost 3090 export function signinUser email passwor

随机推荐