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

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(使用前将#替换为@)

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

  • 有选择地禁用 swaggerUI 中的“尝试一下”

    尽管这里对该主题进行了很长的讨论 https github com swagger api swagger ui issues 156 https github com swagger api swagger ui issues 156 我
  • 类型错误:中间件不是函数

    我正在尝试在我的reactjs 应用程序中应用redux 由于这些错误 我无法继续 我确信我已经安装了我需要的所有依赖项 这是我的 package json 的相关部分 dependencies react redux 5 0 6 redu
  • 从redux中的reducer获取ID

    我是个新手 正在尝试使用 React 和 Redux 构建一个简单的书签应用程序 我无法解决这个问题 用户可以创建一个书签并将其添加到多个文件夹 所以我派了一个addMark bookmark 行动 然后addMark folder or
  • Redux createStore() 已弃用 - 无法在 Redux 操作中从 getState() 获取状态

    So the createStore Redux 现已弃用 并且configureStore 推荐自 reduxjs 工具包 https redux toolkit js org 我很确定这与无法获得有关userInfo状态使用getSta
  • 应用程序关闭时访问持久存储

    目前 我正在使用 redux persist 在本地存储数据 我想在应用程序关闭时访问 Persited 商店 就像有新的推送通知时一样 我尝试使用 AsyncStorage 访问存储 结果返回 null if AppState curre
  • 使用 Redux 获取数据时如何避免竞争条件?

    我们有一个异步获取对象的操作 我们称之为getPostDetails 它需要一个参数来获取哪个帖子 一个 ID 用户会看到一个帖子列表 可以单击其中一个来获取一些详细信息 如果用户点击 Post 1 我们会发送一个GET POST动作可能看
  • 在 React 中的按键上应用按钮“活动”样式

    我在 React Redux 中有一个鼓应用程序 它的功能齐全 但我希望能够在相应的按键按下时应用活动按钮样式 就像我物理单击按钮时一样 就目前情况而言 单击按钮会进行转换 但键入相应的键只会播放音频文件 而不会真正链接到按钮 有没有办法在
  • bindActionCreators 和 mapDispatchToProps - 我需要它们吗?

    我正在查看一个 React Redux 应用程序 并尝试了解一切是如何工作的 在其中一个组件中 我看到了以下几行代码 import bindActionCreators from redux function mapDispatchToPr
  • Ngxs - 调用 Angular 服务:好的做法吗?

    当我使用ngxs我的应用程序应该做什么 我的组件调用一个服务 并且该服务调度一个操作 结果作为有效负载 我的组件调度一个动作 我的 状态调用服务 我的观点是 Dispatched Action 本身应该是不可变的 并且不用于返回结果 相反
  • React Router 4 中 URL 更改但视图未更改

    我使用的是react router 4而不是react router 3 所以我使用的是react router dom 我试图让 this props history push 工作 但它所做的只是保持视图相同 但 URL 发生了变化 例
  • 测试 React Redux - 无法读取未定义的属性或未定义的包装器

    我在为我的测试套件在组件中设置 Redux 存储时遇到了一些问题 问题是 即使我尝试未连接的挂载 测试也会在 authState 中查找变量时抛出错误 我有以下组件 import React Component from react imp
  • 如何使用 @ngrx/data 自定义我的减速器?

    我正在学习使用 ngrx data 确实 使用该库我推进了很多代码 但在个性化它时我遇到了问题 我已经了解了如何将字段添加到集合中 export const entityMetadata EntityMetadataMap User add
  • 既然 Angular 是双向数据绑定,为什么我应该在 Angular 中使用 Redux?

    据我了解 Redux 主要是为了在 javascript 应用程序中启用双向数据绑定 这对于非双向数据绑定的框架非常有用 例如 React 但为什么要在 Angular 中使用它 因为它本身就是双向数据绑定的 为了说明我的问题 我在本机 A
  • useSelector 常量在调度后不更新

    这里有一个代码沙盒 https codesandbox io s competent moon 9ehen getIDs 更新cells 然后需要initializeCells 但是 此更改在分派操作后不会反映出来 尽管如此 我还是可以看到
  • 如何在 RxJS 中通过 ID 去抖

    我的问题是下一个 我想取消我的应用程序的点赞功能 我使用操作在我的应用程序中进行更改 例如 dispatch likePost 1 gt dispatch type LIKE POST id 1 给出下一个例子 我在时间 0 发送一个操作
  • 使用异步数据初始化组件

    我想弄清楚如何以及在哪里在react redux thunk中为我的选择框加载数据 即在我的操作上调用调度 我不确定它是否应该放入我的应用程序容器的构造函数中 或者我应该将其加载到我的组件中 在我的示例中 MyDropdown 我的主要应用
  • 监听 redux 动作

    我想创建一个可重用的 redux 表模块 它将存储和更新页码 显示的总页数等 我可以在所有页面之间共享这些模块 但是 我需要更新操作来触发刷新数据操作 该操作将根据页面到达不同的端点 因此 可能类似于页面特定的监听 RefreshData
  • useEffect 中的 setTimeout 函数输出缓存的状态值

    这很简单 我正在使用 Redux 来管理我的状态 我有一个setTimeout函数在一个useEffect功能 The setTimeout超时值为50000ms 我想要 SetTimeout 处理程序做什么 After 50000ms t
  • Redux-saga 从操作中获取数据返回patternOrChannel 未定义

    我需要将动态数据从屏幕发送到操作 减速器 并使用该数据从 API 获取数据 但是当我在我的rootSaga我会收到这样的错误 在检查 take patternOrChannel 时未捕获 patternOrChannel 未定义未捕获在 r
  • Redux 状态在 mapStateToProps 中未定义

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

随机推荐