- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 React/Redux 创建一个应用程序,我是使用 React 和 Redux 的新手。我一直在试图弄清楚如何构建 redux 存储。这是我想要实现的目标的简要描述,使用 redux createEntityAdapter 文档中的书籍示例进行概括
我有一个包含书籍 list 的页面。用户可以单击一本书或多本书,并为每本书显示一个章节列表。新的或缺失的章节可以在服务器上可用时随时添加。添加的章节需要添加到列表中的正确位置。
bookList : [ Book1, Book2, Book3, ...]
ChapterList: {
Book1 : {
chapters: [
{
Chapter : 'Chapter1',
info: 'Chapter info',
other: 'more stuff'
},
{
Chapter : 'Chapter2',
info: 'Chapter info',
other: 'more stuff'
},
{...}
],
bookInfo: 'info about book'
},
Book2 : { ... },
Book3 : { ... }
}
问题是章节信息正在流式传输,因此会不断更新,丢失的章节可以随时到达。因此,每次新数据到达时我都需要对章节数组进行排序,而该数组不是很长,以 50 个元素的顺序,新数据每秒到达几次。
const ChapterListAdapter = createEntityAdapter({
// where bookNum needs to Book1, Book2, Book3 etc...
selectId: (chapterList) => chapterList[bookNum].chapters,
sortComparer: (a, b) => a.chapters.localeCompare(b.chapters
})
我该如何解决这个问题?修改店铺?有没有办法展平chapterList,使章节处于顶层?我是否将自己的规范化/排序逻辑写入 reducer ?
最佳答案
Is there a way to flatten chapterList such that chapters is at the top level? Do I write my own normalizing/sorting logic into the the reducer?
{
books: {
ids: [1, 2, 3],
entities: {
1: {
id: 1,
title: "Book 1",
bookInfo: 'info about book',
chapterIds: [75, 962, 64], // an ordered array of chapters
},
2: { /* ... */ },
3: { /* ... */ }
}
},
chapters: {
ids: [64, 75, 962],
entities: {
64: {
id: 64,
name: "Some Chapter Title",
info: "",
other: "",
bookId: 1 // the id of the book that this chapter belongs to
},
75: { /* ... */ },
962: { /* ... */ }
}
}
}
在 typescript 方面:
import { EntityState, EntityId } from "@reduxjs/toolkit";
export interface Book {
id: EntityId;
title: string;
bookInfo: string;
chapterIds: EntityId[];
}
export interface Chapter {
id: EntityId;
name: string;
info: string,
other: string;
bookId: EntityId;
}
interface State {
books: EntityState<Book>;
chapters: EntityState<Chapter>;
}
const bookAdapter = createEntityAdapter<Book>();
const chapterAdapter = createEntityAdapter<Chapter>();
export const {
selectIds: selectBookIds,
selectById: selectBookById
} = bookAdapter.getSelectors((state: State) => state.books);
export const {
selectById: selectChapterById
} = chapterAdapter.getSelectors((state: State) => state.chapters);
所以每个组件需要的唯一 Prop 是
id
:
const Chapter = ({ id }: { id: EntityId }) => {
const chapter = useSelector((state) => selectChapterById(state, id));
// probably some hook here to request the chapter if not loaded
// dispatch an async thunk inside of a useEffect
if (!chapter) {
return <Loading />;
}
return (
<div>
<h3>{chapter.name}</h3>
<p>{chapter.info}</p>
</div>
);
};
const Book = ({ id }: { id: EntityId }) => {
const book = useSelector((state) => selectBookById(state, id));
// probably some hook here to request the book if not loaded
// dispatch an async thunk inside of a useEffect
if (!book) {
return <Loading />;
}
return (
<div>
<h1>{book.title}</h1>
<p>{book.bookInfo}</p>
<h2>Chapters</h2>
<ul>
{book.chapterIds.map((chapterId) => (
<li key={chapterId}>
<Chapter id={chapterId} />
</li>
))}
</ul>
</div>
);
};
您可以
check out this answer有关如何仅在尚未加载实体时从 API 请求实体的更多信息。
关于reactjs - Redux 如何在嵌套属性上使用 createEntityAdapter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64269690/
我正在使用 Redux-toolkit with entityAdapter用于我的 React App 中的状态管理。我想对我的表行是 Redux-toolkit entityAdapter 实体的
我正在使用 React/Redux 创建一个应用程序,我是使用 React 和 Redux 的新手。我一直在试图弄清楚如何构建 redux 存储。这是我想要实现的目标的简要描述,使用 redux cr
我已经成功地实现了一个 redux-toolkit api。现在,我正在尝试使用 createEntityAdapter 来使用预构建的选择器方法。 import { createEntityAd
redux-toolkit 网站上的所有示例都显示了 selectIds 的用法或 selectAll . 使用它们中的任何一个都很简单。我有一个 redux-slice我从哪里导出 export c
在开发一个简单的 pet 项目时,我遇到了一个错误,但不知道如何修复它。我是 Typescript 的新手,通过消息错误判断错误在 TS 中。将此代码段添加到文件“apiSlice.ts”后会出现错误
在开发一个简单的 pet 项目时,我遇到了一个错误,但不知道如何修复它。我是 Typescript 的新手,通过消息错误判断错误在 TS 中。将此代码段添加到文件“apiSlice.ts”后会出现错误
我的商店中有一个切片,是我使用来自 Redux Toolkit 的 createEntityAdapter 创建的.在函数组件中,您可以将 useSelector 与从 adapter.getSele
我是一名优秀的程序员,十分优秀!