标签: normalizr

如何将更新合并到标准化的Redux状态

我只是开始使用normalizr来管理我的状态。我已经到达以下代码更新所需对象的地步,但我无法以干净,干燥的方式将它们合并回规范化状态。这样做的首选方式是什么?

请原谅我的傻瓜,谢谢您的宝贵时间。

// normalized state
{
  "entities": {
    "items": {
      "1": {
        "id": 1,
        "title": "Item 1",
      },
      "2": {
        "id": 2,
        "title": "Item 2",
      },
      "3": {
        "id": 3,
        "title": "Item 3",
      },
    },
    "groups": {
      "20": {
        "id": 20,
        "title": "Group 1",
        "items": [ 1, 2 ]
      },
      "21": {
        "id": 21,
        "title": "Group 2",
        "items": [ 3 ]
      }
    }
  },
  "result": [ 20, 21 ]
}

// actions
export const addItem = values => ({
    type: …
Run Code Online (Sandbox Code Playgroud)

redux normalizr

6
推荐指数
1
解决办法
1749
查看次数

Normalizr:按类型而不是多态映射的模式识别实体

对于多态模式,例如Normalizr中的Union,对于模式定义和数据:

const data = { owner: { id: 1, type: 'user', name: 'Anne' } };

const user = new schema.Entity('users');
const group = new schema.Entity('groups');
const unionSchema = new schema.Union({
  user: user,
  group: group
}, 'type');

const normalizedData = normalize(data, { owner: unionSchema });
Run Code Online (Sandbox Code Playgroud)

规范化数据采用以下形式:

{
  entities: {
    users: { '1': { id: 1, type: 'user', name: 'Anne' } }
  },
  result: { owner: { id: 1, schema: 'user' } }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,实体键入架构键,users但结果对象仅包含UnionSchema定义中架构的键.这可能使得在没有完全非规范化的情况下稍后匹配元素变得困难.

是否有一些更好的方法来使用normalizr对这些数据进行标准化,以便更容易从实体中提取实体entities,给定 …

javascript normalizr

6
推荐指数
1
解决办法
479
查看次数

一对多关系的Redux状态形状

在设计具有相关实体的状态形状时,官方Redux文档建议通过ID而不是嵌套来引用:http://redux.js.org/docs/basics/Reducers.html#note-on-relationships.

在一对多关系中,Normalizr会将引用放在关系的"一"侧,例如:

"posts": {
  "1": {
    ...
    comments: ["1", "2", "3"]
...
Run Code Online (Sandbox Code Playgroud)

这比将参考文献放在"多"方面要好吗?例如

"comments": {
  "7": {
    ...
    postId: "1"
...
Run Code Online (Sandbox Code Playgroud)

创建Redux商店时,我在哪里放置引用是否重要?

redux normalizr react-redux

6
推荐指数
1
解决办法
562
查看次数

反正义逆向过程策略

我有一个API,它使用fields属性中的属性给出这样的数据.

{
records: [
    {
    id: "123",
    fields: {
        author: {
        id: "1",
        name: "Paul"
        },
        title: "My awesome blog post",
        comments: [
        {
            id: "324",
            commenter: {
            id: "2",
            name: "Nicole"
            }
        }
        ]
    }
    }
]
};
Run Code Online (Sandbox Code Playgroud)

在规范化时,我现在用一个简单的方法处理它,processStrategy: (input, parent, key) => input.fields但我想再次对此进行非规范化,以便非规范化实体包含这个字段结构,因为API期望它这样.

到目前为止,我的规范化数据非规范化,const denormalizedData = denormalize([123], [article], normalizedData.entities)省略了字段:

[
{
    "author": {
    "id": "1",
    "name": "Paul"
    },
    "title": "My awesome blog post",
    "comments": [
    {
        "id": "324",
        "commenter": {
        "id": "2",
        "name": "Nicole" …
Run Code Online (Sandbox Code Playgroud)

normalizr

6
推荐指数
1
解决办法
98
查看次数

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

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

entities: {
    users:{
        1: {
            name: 'John',
            posts: [ 1, 4 ]
        }
    },
    posts: {
        1: {
            name: 'First Post',
        },
        4: {
            name: 'Second Post',
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

let filteredPosts = {};
entities.users.posts.forEach(key => {
    if(posts.hasOwnProperty(key))
        filteredPosts[key] = posts[key]
});
Run Code Online (Sandbox Code Playgroud)

以及显示该用户帖子的页面,例如:

render() {
    return(
        <div>
            {Object.keys(filteredPosts).map(key => {
                return (
                    <div>{filteredPosts[key].name}</div>
                );
            })}
        </div>
    )
}
Run Code Online (Sandbox Code Playgroud)

我的实体reducer非常简单:

import { merge } from 'lodash';
...
function entities(state = { users: {}, posts: {} }, action) {
    if …
Run Code Online (Sandbox Code Playgroud)

javascript reactjs redux normalizr

5
推荐指数
1
解决办法
2602
查看次数

Redux normalizr +处理减少的响应

Normalizr非常擅长创建实体的结构化JSON存储库.

我们有很多案例显示数据列表,例如posts已经规范化的数据列表.其中posts列出了API响应被限制在几个关键的领域.

我们还有一些显示其中一个的情况,posts尽管我们现在需要从API中获取具有所有字段的FULL JSON实体.

如何处理这个问题最好?

一个一个单独的减速,形实转换/佐贺,选择和行动?

B只需post将从API获取的扩展版本插入到reducer中.从以前重用选择器等?

javascript api-design reactjs redux normalizr

5
推荐指数
1
解决办法
1335
查看次数

如何使用 Normalizr 在 Redux 状态中展平多对多关系?

设想

我们有一个映射以下关系的数据库:

  • Atag有很多campaigns
  • Acampaign有很多tags
  • campaigns和之间的关系tags由一个称为 a 的关联实体表示campaign_tag
  • 该campaign_tag实体拥有priority属性

题

当我们的关联实体没有唯一的 ID/值时,我们如何实现normalizr(或任何类似的库)来生成一个扁平化的应用程序状态来解释我们的关联实体?

笔记/杂念

我见过的其他例子只绘制了原始实体,似乎更适合一对多或一对一的关系。他们通常产生这样的状态树:

{
  entities: {
    campaigns: {
      '1': { id: 1, name: 'Ace', tags: [1, 2, 3] },
      ...
    },
    tags: {
      '1': { id: 1, name: 'Example Tag', campaigns: [1, 2, 3] },
      ...
    }
  },
  ...
}
Run Code Online (Sandbox Code Playgroud)

我们的关联实体会进入那个entities组吗?我们应该只添加唯一的 ID 吗?这似乎适得其反。扁平化这种关系是否合适?

任何帮助表示赞赏,谢谢。

reactjs redux normalizr

5
推荐指数
1
解决办法
1003
查看次数

如何获取 npmjs.com 中包的 url 而不是使用 npm 安装

我正在创建一个基于reactjs 的html 页面。

我想对我的数据使用normalizr。

我可以通过以下方式直接在html中获取reactjs:

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.4.2/react.js"></script>
Run Code Online (Sandbox Code Playgroud)

但如何获得 Normalizr. 我没有找到任何这样的链接。因为它说使用 npm 安装。

我想像上面的reactjs一样直接在html中使用,这样可以吗

npm reactjs normalizr

5
推荐指数
1
解决办法
1695
查看次数

使用非规范化时是否可以正确记住重新选择选择器?

我最近注意到,在重新选择选择器中使用 normalizr 的“非规范化”功能时,记忆每次都失败。

这归结为必须将整个实体对象作为参数传递给选择器,我认为这对于浅层比较而言嵌套太深。

有没有人对如何在这里保留记忆有任何想法,或者尝试记忆实体是否会过度优化?

谢谢!

memoization reactjs redux normalizr reselect

5
推荐指数
0
解决办法
190
查看次数

Redux - createSlice 内标准化的嵌套数据组织

我有一个从 API 返回的深层嵌套数据对象,如下所示的 JSON。

我正在使用 Redux 工具包createSlice创建一个切片trip

所以目前在 my 中createSlice,我想存储一系列旅行。

我还希望能够更新单次行程或部分行程

  • 例如,假设我想更新旅行项目的开始日期
  • 或者,假设我想更新旅行项目的成员姓名

我的问题和疑虑:

  • 我目前将所有这些实体返回到 createSlice 中,trip但我不确定一旦实体标准化,是否应该将它们分成单独的createSlices?如果是这样,这是如何完成的或者这是一种反模式?
  • 嵌套实体应该如何定义initialState?
  • 我应该在我的中定义所有规范化实体吗initalState?trip_item如果我这样做,当我想更新or时,我的减速器会是什么样子trip_item_member?
  • 我的标准化数据看起来“正确”吗?我省略了使用mergeStrategyBetweentrips_items_members和trip_members我知道我应该这样做,但还没有弄清楚它是如何工作的或者这里是否有必要?

笔记:

RTK 文档中有一个示例,其中显示createSlice与 3 个单独的实体一起使用,这些实体最初来自 1 个 API 调用。它看起来像 3 个独立的文件,但尚不清楚它们之间如何共享数据。

这就是我的旅行createSlice的样子

/**
 * Get trip by ID action
 */
export const getTripByID = createAsyncThunk(
  'trips/getTripByID',
  async ({ uid }) => { …
Run Code Online (Sandbox Code Playgroud)

redux normalizr redux-toolkit

5
推荐指数
1
解决办法
2455
查看次数