问题标签 [normalizr]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
2203 浏览

redux - Redux + Normalizr 分离(删除)操作

我使用带有 normalizr 的 redux 来规范来自服务器的响应,基本上遵循真实世界的示例。这种方式entitiesreducer很简单,只需要合并响应即可。我现在遇到的问题是一种delete操作。我发现了 normalizr repo 的这个 issue#21,但仍然不知道如何解决这个问题。例如,

当前状态是

标准化响应是

如您所见,后端 api 仅返回属于该类别的所有产品 id,在这种情况下,“2”是分离的。当 'entities' reducer 合并这个响应时,“2”仍然存在。现在我只是重新加载页面,但我想知道是否有更好的方法来处理这种情况?

entitiesreducer 中,我只是像在现实世界的例子中一样合并它。

return merge({}, state, action.payload.entities);

0 投票
5 回答
13634 浏览

javascript - 如何添加/删除使用 normalizr 生成的 redux 存储?

查看README中的示例:

鉴于“坏”结构:

添加新对象非常容易。我所要做的就是像

在减速机中。

现在考虑到“好”树的结构,我不知道应该如何处理它。

我想到的每一种方法都需要一些复杂的对象操作,这让我觉得我没有走在正确的轨道上,因为 normalizr 应该让我的生活更轻松。

我在网上找不到任何以这种方式使用 normalizr 树的人的示例。官方示例没有添加和删除,所以它也没有帮助。

有人可以让我知道如何以正确的方式从 normalizr 树中添加/删除吗?

0 投票
1 回答
572 浏览

javascript - 构建本地化 react/redux 应用的 store

我很难在本地化的博客应用程序中构建我的数据。

我的应用程序以三种语言(英语、法语和俄语)显示带有嵌入图片(一对多)的帖子。

访问者可以选择其语言环境。编辑可以用三种语言编辑其帖子的本地化版本。

目前,我的商店的结构如下所示:

在这个阶段,我的 reducer 并不算太臃肿,但我觉得我应该进一步规范化,以便预测何时添加与文章相关的标签、作者和其他国际化项目。

所以我正在考虑(i)在商店中为语言创建一个额外的字典,(ii)“扁平化”所有其他字典以摆脱“语言环境”子存储键,(iii)在每个中添加一个 language_id 字段存储在其他字典中的项目和 (iv) 将我的每个字典中的数字键修改为复合键。这看起来像这样:

“articles”、“pictures”和“editStatesOfFieldsOfArticles”字典的键的最后一位将对应于 locale/language_id,而其他数字将对应于项目 id。

我发现当我有适用于所有三种语言的商店修改时,我会从这种更扁平的结构中受益,因为我不需要迭代语言(例如,如果我删除一篇文章,该文章应该全部删除)三种语言,我目前必须在本地化子词典和所有辅助商店的子词典(例如“editStateOfFieldsOfArticles”(我还有一些其他这样的辅助词典))上做一个 for...in。

但是,我不完全确定我是否真的会从进一步展平我的哈希中获得任何其他好处(并且 for...in 循环不会有问题,只需管理三种语言 - 此外,在我的用例中,我需要删除一篇文章,并且这种删除需要反映在所有三种语言中,我仍然需要遍历三种语言数组以删除扁平文章字典中的三个相应记录)。

另外,我担心性能问题:因为我会将我的整个集合(文章或任何其他国际化项目)存储在同一个平面树下,无论它们涉及什么语言,我担心访问这些值可能会减慢比较到一个更结构化的树,我可以通过“子键”向下访问本地化分支来访问项目——事实上,后端数据库将本地化的文章存储在不同的本地化表中)。

我将非常感谢任何有为国际化内容或其他具有复杂交叉关系的商店构建 Redux 商店的经验的人,他们可以就自己的经验提供一些反馈或建议或提示: - 代码可读性,特别是在减速器和记忆的选择器, - 比较嵌套树与扁平树的性能, - 进一步规范化与保持“一点”嵌套的整体优势。

0 投票
3 回答
2769 浏览

javascript - React redux normalizr:如何处理嵌套实体?

假设我有一个这样的结构,它是从 API 获取并在我的实体上使用“normalizr”的结果:

现在我有一个按用户过滤帖子的方法,它基本上可以做到这一点:

还有一个页面显示来自该用户的帖子,例如:

我的实体减速器非常简单:

现在,如果我向 API 发出请求为该用户添加帖子,返回新创建的帖子记录,该记录将自动添加到我的实体上的帖子中。

我将如何处理更新用户以反映该更改,以便用户现在有 3 个帖子,数组中有新的帖子 ID?

我应该创建一个减速器并听取帖子创建操作,然后state.entities.users.posts在那里更新吗?重新获取实体似乎不是一种选择。最好的方法是什么?

谢谢

更新:

这是我现在必须使用的解决方案,以保持数据一致。我修改了我的回复以说明创建的帖子 ID。我知道这可以分解为多个减速器,但我仍然想知道是否有更好和更直接的方法,我不必为每个嵌套实体都这样做。

0 投票
1 回答
1843 浏览

javascript - Normalizr - 没有预期的结果

我正在尝试使这个简单的响应正常化。我不确定我在做什么有什么问题,或者我不了解 normalizr 文档。

这只会对“结果”对象产生相同的响应,并且实体对象是空的。有人可以帮帮我吗。首先,我试图将帖子标准化,然后再进行评论。但我无法跨过第一步。

0 投票
2 回答
625 浏览

reactjs - 使用 normalizr 规范化 api 响应

因此,当您请求资产时,端点会以类似的方式响应。Bios 只是一个例子。

而且我想将它展平为类似的东西,我什至不确定这是否有意义:

但是我无法让模式在它们击中实体之前识别任何嵌套。如果我通过normalize(camelizedJson.embedded.bios, bioSchema),它可以工作,但如果我通过它,normalize(camelizedJson.embedded, bioSchema)我无法让它意识到我想解析bios.

我想我可以将另一个变量传递给中间件,为其提供成功解析的嵌入式密钥。

0 投票
1 回答
72 浏览

javascript - 如何在 normalizrJS 中应用 arrayOf('schema') 之前展平数组

假设一个用户收藏了许多猫,当被问及用户的收藏时,api 端点给出了一个猫列表:

现在我的问题是,我将如何规范化这些实体,以便得到以下结果,

我将如何使用 normalizr 完成此操作?

0 投票
1 回答
5279 浏览

redux - 使用 normalizr 规范化简单数组

我刚刚开始使用带有 Redux 的 normalizr,我被困在一个对我来说似乎很简单的问题上,但我可能做错了。所以我想像这样标准化一个数组:

变成这样的结构:

我试过这样做:

但这给了我一个看起来像这样的结构:

现在没有文章 ID 数组。我假设我在这里遗漏了一些东西:

但在这种简单的情况下无法弄清楚需要去那里

0 投票
1 回答
3745 浏览

redux - 如何使用 Normalizr 处理基本的嵌套 JSON?

我有一个非常标准的嵌套 JSON 响应。 项目有许多仪表板仪表板有很多图表

定义和使用我的模式的正确方法是什么?

下面是我的 Schemas.js 的代码、我的 API 响应以及 Normalizr 将我的 API 响应转换成的代码。

Schemas.js:

我的 API 响应:

当我在一个动作中收到这个 JSON 时,我会这样做normalize(response, Schemas.project);。这似乎将整个响应移动到entities.projects.undefined.

我应该如何正确定义和使用我的模式?

参考:

https://github.com/gaearon/normalizr

https://github.com/reactjs/redux/blob/master/examples/real-world/actions/index.js

0 投票
2 回答
400 浏览

javascript - 如何/在哪里从 redux 应用程序中的服务器转换日期?

我现在开始研究redux。我以实际示例为起点,使用 normalizr 和 reselect 来处理数据。

现在,我需要了解将来自服务器的日期转换为 js Date 对象的最佳位置在哪里。由于 normalizr 已经处理了“一些模式”,我认为它也可以做到这一点,但我没有在那里找到它。

我应该在哪里转换这些日期?我的假设是我必须保留那些已经在商店中转换的日期。那正确吗?