騰起權,你的狀態可能可能最終看起來像:
boards: {
entities: {
board0: { id: "board0", threads: [ thread2, thread4, ...], data: ... },
board1: { id: "board1", threads: [ thread0, thread3, ...], data: ... },
},
ids: [ board0, board1, ... ],
},
threads: {
entities: {
thread0: { id: "thread0", posts: [ post0, post4, ... ], data: ... },
thread1: { id: "thread1", posts: [ post2, post3, ... ], data: ... },
},
ids: [ thread0, thread1, ... ],
},
posts: {
entities: {
post0: { id: "post0", data: ... },
post1: { id: "post1", data: ... },
},
ids: [ post0, post1, ... ],
},
這適用於一堆理由。首先,傳入的帖子和線程通過動作添加到狀態,這意味着您可以很容易地將它們標準化爲,因爲它們在中。不要將完整的線程對象直接放入threads
陣列,而是將其添加到threads.entities.<threadId>
並使用它的ID更新boards.<currentBoardId>.threads
陣列。傳入的post
對象也是如此。就這樣,它正常化了。
現在,當涉及到顯示組件時,每個board
都有一個非常輕量級的列表,名爲threads
。而不是一個長度爲boards * threads
的數組上的過濾器,您可以通過僅在該電路板上可見的線程ID數組映射一個映射,並且具有固有快速的字典查找。
線程可見板:
const boardThreads = boards.entities[props.params.boardId].threads
.map(threadId => threads.entities[threadId]
帖子所選主題:
const threadPosts = threads.entities[selectedThreadId].posts
.map(postId => posts.entities[postId])
爲每個集合額外ids
場是沒有必要的,但我覺得它有用。例如,列出所有板:
const allBoards = boards.ids.map(id => boards.entities[id])
這可能,但是,僅僅是使用Object.keys
功能,而不是完成。直到開發。
如果你沒有真正遇到性能損失,你不應該擔心它。 重新選擇可能是您的情況的一個很好的選擇,因爲它的緩存能力。 – Scarysize