ngrx 处理对象中的嵌套数组

2023-12-22

我正在学习 redux 模式并使用 ngrx 和 Angular 2。我正在创建一个具有以下形状的示例博客网站。

export interface BlogContent {
  id: string;
  header: string;
  tags: string[];
  title: string;
  actualContent: ActualContent[];
}

我的减速器和动作如下:

import { ActionReducer, Action } from '@ngrx/store';
import * as _ from 'lodash';
export interface ActualContent {
  id: string;
  type: string;
  data: string;
}

export interface BlogContent {
  id: string;
  header: string;
  tags: string[];
  title: string;
  actualContent: ActualContent[];
}

export const initialState: BlogContent = {
  id: '',
  header: '',
  tags: [],
  title: '',
  actualContent: [],
};

export const ADD_OPERATION = 'ADD_OPERATION';
export const REMOVE_OPERATION = 'REMOVE_OPERATION';
export const RESET_OPERATION = 'RESET_OPERATION';
export const ADD_IMAGE_ID = 'ADD_IMAGE_ID';
export const ADD_FULL_BLOG = 'ADD_FULL_BLOG';
export const ADD_BLOG_CONTENT_OPERATION = 'ADD_BLOG_CONTENT_OPERATION';
export const ADD_BLOG_TAG_OPERATION = 'ADD_BLOG_TAG_OPERATION';

export const blogContent: ActionReducer<BlogContent> = (state: BlogContent= initialState, action: Action ) => {
    switch (action.type) {
      case  ADD_OPERATION :
        return Object.assign({}, state, action.payload );
      case  ADD_BLOG_CONTENT_OPERATION :
        return Object.assign({}, state, { actualContent: [...state.actualContent, action.payload]});
        case  ADD_BLOG_TAG_OPERATION :
        return Object.assign({}, state, { tags: [...state.tags, action.payload]});
      case REMOVE_OPERATION :
        return Object.assign({}, state, { actualContent: state.actualContent.filter((blog) => blog.id !== action.payload.id) });
      case ADD_IMAGE_ID : {
        let index = _.findIndex(state.actualContent, {id: action.payload.id});
        console.log(index);
        if ( index >= 0 ) {
          return  Object.assign({}, state, {
            actualContent :  [
              ...state.actualContent.slice(0, index),
              action.payload,
              ...state.actualContent.slice(index + 1)
            ]
          });
        }
        return state;
      }
      default :
        return state;
    }
};

这工作正常,但我不确定它是否是正确的方法,或者我应该以某种方式将 ActualContent 分成它自己的减速器和操作,然后合并它们。 抱歉,如果这篇文章不属于这里,您可以指导我应该把这篇文章放在哪里,我会将其从这里删除。提前致谢。

附:我做了一些研究,但找不到任何具有复杂嵌套对象的文章以便我可以参考。请添加任何有用的 ngrx 或相关主题的博客链接,这可以帮助我。


而不是嵌套结构

export interface BlogContent {
  id: string;
  header: string;
  tags: string[];
  title: string;
  actualContent: ActualContent[]; <------ NESTED
}

您应该处于正常化状态。

例如在这里你应该有类似的东西:

// this should be into your store
export interface BlogContents {
  byId: { [key: string]: BlogContent };
  allIds: string[];
}

// this is made to type the objects you'll find in the byId
export interface BlogContent {
  id: string;
  // ...
  actualContentIds: string[];
}

// ----------------------------------------------------------

// this should be into your store
export interface ActualContents {
  byId: { [key: string]: ActualContent };
  allIds: string[];
}

export interface ActualContent {
  id: string;
  // ...
}

因此,如果您尝试填充您的商店,它看起来像这样:

const blogContentsState: BlogContents = {
  byId: {
    blogContentId0: {
      id: 'idBlogContent0',
      // ...
      actualContentIds: ['actualContentId0', 'actualContentId1', 'actualContentId2']
    }
  },
  allIds: ['blogContentId0']
};

const actualContentState: ActualContents = {
  byId: {
    actualContentId0: {
      id: 'actualContentId0',
      // ...
    },
    actualContentId1: {
      id: 'actualContentId1',
      // ...
    },
    actualContentId2: {
      id: 'actualContentId2',
      // ...
    }
  },
  allIds: ['actualContentId0', 'actualContentId1', 'actualContentId2']
};

在您的逻辑或视图中(例如使用 Angular),您需要嵌套结构,以便可以迭代数组,因此,您不想迭代 ID 的字符串数组。相反你会喜欢actualContent: ActualContent[];.

为此,您创建一个selector。每次您的商店发生变化时,您的选择器都会启动并生成原始数据的新“视图”。

// assuming that you can blogContentsState and actualContentsState from your store
const getBlogContents = (blogContentsState, actualContentsState) =>
  blogContentsState
    .allIds
    .map(blogContentId => ({
      ...blogContentsState.byId[blogContentId],

      actualContent: blogContentsState
        .byId[blogContentId]
        .actualContentIds
        .map(actualContentId => actualContentsState.byId[actualContentId])
    }));

我知道一开始可能需要处理很多事情,我邀请您阅读关于选择器和规范化状态的官方文档 https://redux.js.org/recipes/structuring-reducers/normalizing-state-shape/

当您学习 ngrx 时,您可能想看看我制作的一个名为 Pizza-Sync 的小项目。代码源在Github上 https://github.com/maxime1992/pizza-sync。这是一个我做过类似演示的项目:)。 (您还应该安装Redux 开发工具应用程序 https://chrome.google.com/webstore/detail/redux-devtools/lmhkpmbekcpmknklioeibfkpmmfibljd看看商店怎么样)。

如果您有兴趣,我制作了一个仅关注 Redux 和 Pizza-Sync 的小视频:https://youtu.be/I28m9lwp15Y https://youtu.be/I28m9lwp15Y

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ngrx 处理对象中的嵌套数组 的相关文章

  • 如何从 JavaScript 中计算 HTML 表格的渲染高度?

    调整窗口大小时 我需要知道表格有多大 以便我可以动态地很好地适应中间的所有其他内容 表格高度仅取决于动态加载的内容 如何在 JavaScript 中计算表格的渲染高度 您可以使用element offsetHeight https deve
  • 使用闭包和自调用函数制作计数器

    我想知道为什么这段代码不起作用 var uniqueInteger function var counter 0 return function return counter console log uniqueInteger 0 cons
  • Three.js - 在代码中包含网格数据

    我有这个 Three js 代码 其中 JSON 加载器从文件 models mountain json 加载网格 var Three new function this scene new THREE Scene this camera
  • 如何在 Node.js 中让一个 EventEmitter 监听另一个 EventEmitter?

    我想做这样的事情 var events require events var emitterA new events EventEmitter var emitterB new events EventEmitter emitterA ad
  • JavaScript 变量赋值与 OR 对比 if 检查[重复]

    这个问题在这里已经有答案了 在 JavaScript 中 我最近意识到你可以使用 OR 赋值的逻辑运算符 我想知道这是否被认为是不好的做法 特别是 我有一些具有可选数组输入的函数 如果输入是null or undefined我应该将它设置为
  • 为什么将数据存储为元素的属性存在风险?

    我一直在读同样的东西 直接在 DOM 元素上存储属性值是有风险的 因为可能会发生内存泄漏 但有人可以更详细地解释这些风险吗 按属性 我假设您指的是 DOM 元素上的属性 DOM 元素上的自定义属性安全吗
  • 引入 V8 后,Google Apps 脚本无法为其他用户完全执行

    我编写了一个脚本 得到了这里好心人的大力帮助 该脚本使用 Google Sheets 脚本复制 Google Drive 上的文件夹 和内容 它运行了很长一段时间 但后来我启用了 V8 引擎 现在已禁用 问题是 它仍然适用于我 也许还有其他
  • 点击问题:动态生成的链接不触发点击功能

    下面是两个代码片段 由于某种原因什么也没有发生 但来自同一个 JS 文件的其他 jQuery 函数在带有 UL 的页面上执行得很好 这是在盯着我看吗 ul class paganation li 1 li li a href 2 a li
  • 空 URL 哈希导致页面在 js 事件上跳转

    我有一个带有下一个和上一个按钮的照片库 如果我的某个 javascript 方法由于某种原因被破坏 那么当单击其中一个按钮时 它会向 url 添加一个哈希值 即 www google com 我知道可以给散列一个 div id 来跳转到页面
  • setInterval 内的返回值

    我想在 setInterval 内返回一个值 我只想以一定的时间间隔执行一些操作 这就是我尝试过的 function git limit var i 0 var git setInterval function console log i
  • Web SQL 数据库 + Javascript 循环

    我正在尝试解决这个问题 但我自己似乎无法解决 我正在使用 Web SQL DB 但无法让循环正常使用它 I use for var i 0 i lt numberofArticles 1 i db transaction function
  • 将 JavaScript 引擎嵌入到 .NET 中 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 只是想知道是否有人尝试过将任何 js 引擎嵌入并实际集成到 net 环境中 我可以找到并实际使用 经过L
  • 如何在 angularjs 中修剪()字符串?

    有角度特定的方法吗 如果没有 我应该使用内置的jquery 来做到这一点吗 如果我应该使用内置的jquery 如何在不使用 的情况下访问trim 函数 或者这是必要的 编辑 是的 我知道 str trim 对不起 我需要这个才能在 IE 8
  • Meteor.js 登录事件

    因此 我对 Meteor 框架和 JavaScript 总体来说还很陌生 但我正在使用该框架开发一个小项目 以尝试让自己达到标准 基本上我正在开发一个微博客网站 目前 用户可以通过多种服务登录 fb google 等 我通过插入所需 url
  • RTCDataChannel发送方法不发送数据

    我的 RTCDataChannel 遇到一个奇怪的问题 我正在对 WebRTC 进行一些研究 并且已经可以进行 WebRTC 音频 视频聊天 现在我想使用 RTCDataChannel 添加文本聊天和文件共享 我已经像这样创建了 RTCDa
  • 在声明组件选择器时添加指令 - Angular 7

    我正在学习 Angular 并通过单击按钮动态创建组件 我正在尝试使用 Angular Material 的拖放功能来拖动这些创建的组件以对它们进行排序 我的基本组件 html 中有以下代码 div style margin 20px di
  • 在 Google Apps 脚本中的文本前插入换行符

    我需要在 Google 文档中的某些文本之前插入一些换行符 尝试过这种方法但出现错误 var body DocumentApp getActiveDocument getBody var pattern WORD 1 var found b
  • 如何根据所需表单输入的值更改 CSS 样式

    我想知道如何编写 javascript 来改变所需的表单元素的样式 如果它们有价值的话就改变它们 我想要做的是当所需的文本字段为空时 在它们周围有一个彩色边框 并在它们有值时删除边框样式 我想做的是编写一个 javascript 函数来检查
  • 使用 jquery 提供附加功能时菜单未正确对齐

    I need to make a mega menu similar to one as show in image below 到目前为止 我已经能够在某种程度上使其发挥作用 例如jsFiddle 在这里 http jsfiddle ne
  • 获取淘汰赛中被点击元素的索引

    获取无序列表中单击元素的索引的最佳方法是什么 让我举个例子 假设我有以下 HTML 代码 ul li p p li ul 现在我有以下 javascript 代码来获取索引 self itemClicked function data it

随机推荐

  • 如何在执行脚本之前自动清除 VSCode 中的终端? [复制]

    这个问题在这里已经有答案了 我目前正在使用 VS Code 来学习 Python 所以我必须每分钟运行 10 15 次脚本 只是做一些小的编辑并学习所有的东西 我正在 VS code 的集成终端中运行脚本 所以显然终端变得非常混乱 我必须始
  • Anaconda 与 Python 有何关系?

    我是初学者 我想学习计算机编程 所以 现在我已经开始自学Python 并掌握了一些C和Fortran编程的知识 现在 我已经安装了Python 3 6 0版本 并且我一直在努力寻找合适的文本来学习这个版本的Python 甚至在线讲座系列也要
  • 类型转换和类型转换之间的区别? [复制]

    这个问题在这里已经有答案了 可能的重复 铸造和转换之间有什么区别 https stackoverflow com questions 3166840 what is the difference between casting and co
  • 将配置文件的内容读取到与其关联的 dll 中

    我已将字符串保存在 dll 应用程序的设置中 我想找回它们 这是我的 dll 的配置文件
  • 如果已命中断点 A,则启用断点 B

    我经常发现自己在代码中的某处设置断点 A 并在命中断点时手动启用一个或多个断点 一个典型的情况是当我正在调试单元测试并且不关心前面的测试时 void testAddZeros Number a 0 Number b 0 Number res
  • 给定 WSDL 的 Web 服务客户端

    我正在尝试用 Java 创建一个 Web 服务客户端 我不知道该怎么做 这是 WSDL 的 URL https testservices gatewayedi com PayerList payerlist asmx wsdl https
  • 合并多列,排除空值

    我试图弄清楚如何组合多个列 不包括 NA 值 输入数据框 data lt data frame id c 1 3 Item1 c Egg Item2 c Chicken Flour Item3 c Bread Item4 c Milk 所需
  • docker 中的 Plotly dash 不加载资源

    我有一个多页破折号应用程序 在本地运行时可以按预期工作 女服务员服务 listen 0 0 0 0 80 web app wsgi application 因此资产文件夹中的所有资产都正确加载 图像加载了src app get asset
  • 有没有更好的方法来计算中位数(而不是平均值)

    假设我有以下表定义 CREATE TABLE x i serial primary key value integer not null 我想计算的中位数value 不是AVG 中位数是将集合分为包含相同数量元素的两个子集的值 如果元素个数
  • Tensorflow Callback:如何将最佳模型保存在内存而不是磁盘上

    我使用 Tensorflow 使用以下函数进行回归 import tensorflow as tf def ff args kwargs model tf keras models Sequential model add tf keras
  • jQuery 对象和 DOM 元素

    我想了解 jQuery 对象和 DOM 元素之间的关系 当 jQuery 返回一个元素时 它显示为 object Object 在警报中 什么时候getElementByID返回一个显示为的元素 object HTMLDivElement
  • 重载+以支持元组

    我希望能够用 python 写这样的东西 a 1 2 b 3 4 c a b c would be 4 6 d 3 b d would be 9 12 我意识到您可以重载运算符以与自定义类一起使用 但是有没有办法重载运算符以与对一起使用 当
  • 在 Linux 中查找最小文件的名称?

    假设您必须找到目录中第四小的 非隐藏 文件的名称 执行此操作的正确命令是什么 假设我是一个只知道的人ls l head tail line and awk print 陈述 From man ls S按大小降序对输出进行排序 r反转输出的顺
  • Thread.sleep() 停止我的绘画?

    我正在制作一个程序 尝试为一张在屏幕上移动的卡片设置动画 就像您实际上从桌子上绘制它一样 这是动画的代码 public void move int x int y int curX this x the entire class exten
  • sklearn:用户定义的时间序列数据交叉验证

    我正在尝试解决机器学习问题 我有一个特定的数据集时间序列元素 对于这个问题 我使用著名的 python 库 sklearn 这个库中有很多交叉验证迭代器 还有几个迭代器用于您自己定义交叉验证 问题是我真的不知道如何定义时间序列的简单交叉验证
  • 为什么“允许的内存大小已耗尽”?

    我正在编写一个批处理脚本并得到一个Allowed memory size of 134217728 bytes exhausted error 我不明白为什么内存会被填满 我尝试取消设置 row变量 但这并没有改变什么 这是我的代码 sql
  • 并发和内存模型

    我在看this http channel9 msdn com posts AFDS Keynote Herb Sutter Heterogeneous Computing and C AMPHerb Sutter 关于 GPGPU 和新的
  • Sublime Text 2 - 在解释器中运行选定的 python 代码

    在 Sublime Text 编辑器中编辑 python 脚本时 我想逐行运行脚本 或者在嵌入式解释器中逐块运行脚本 有没有一个方便的方法来做到这一点 对我来说完美的方法是 选择几行代码 点击快捷方式 这将在解释器中运行选定的代码 我认为有
  • 排除R中df中顶部和底部1%的数据

    对于示例数据框 set seed 1000 a lt rnorm 1000 b lt seq 1 1000 by 1 df lt data frame b a 我想排除数据中前 1 和后 1 a 列 我读过 R 中的修剪和分位数 但似乎无法
  • ngrx 处理对象中的嵌套数组

    我正在学习 redux 模式并使用 ngrx 和 Angular 2 我正在创建一个具有以下形状的示例博客网站 export interface BlogContent id string header string tags string