我只是开始使用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) 对于多态模式,例如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,给定 …
在设计具有相关实体的状态形状时,官方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商店时,我在哪里放置引用是否重要?
我有一个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) 假设我有一个这样的结构,这是从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) Normalizr非常擅长创建实体的结构化JSON存储库.
我们有很多案例显示数据列表,例如posts已经规范化的数据列表.其中posts列出了API响应被限制在几个关键的领域.
我们还有一些显示其中一个的情况,posts尽管我们现在需要从API中获取具有所有字段的FULL JSON实体.
如何处理这个问题最好?
一个一个单独的减速,形实转换/佐贺,选择和行动?
B只需post将从API获取的扩展版本插入到reducer中.从以前重用选择器等?
我们有一个映射以下关系的数据库:
tag有很多campaignscampaign有很多tagscampaigns和之间的关系tags由一个称为 a 的关联实体表示campaign_tagcampaign_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 的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中使用,这样可以吗
我最近注意到,在重新选择选择器中使用 normalizr 的“非规范化”功能时,记忆每次都失败。
这归结为必须将整个实体对象作为参数传递给选择器,我认为这对于浅层比较而言嵌套太深。
有没有人对如何在这里保留记忆有任何想法,或者尝试记忆实体是否会过度优化?
谢谢!
我有一个从 API 返回的深层嵌套数据对象,如下所示的 JSON。
我正在使用 Redux 工具包createSlice创建一个切片trip
所以目前在 my 中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) normalizr ×10
redux ×7
reactjs ×5
javascript ×3
api-design ×1
memoization ×1
npm ×1
react-redux ×1
reselect ×1