reactjs - 如何使用 redux reselect 避免冗余
问题描述
我有一个包含帖子的 redux 状态,我将其存储为具有以下形状的单个对象:
posts: {
1: { isPublic: true, content: 'foo' },
2: { isPublic: true, content: 'bar' },
3: { isPublic: false, content: 'foobar' },
}
我正在使用 reselect 从我的组件中获取状态,并为此创建了 2 个选择器:
const getPostsEntities = (state) => state.posts;
export const getPosts = createSelector(
[ getPostsEntities ],
(posts) => Object.keys(posts).map( id => posts[id])
);
export const getPublicPosts= createSelector(
[ getPostsEntities ],
(posts) => Object.keys(posts).map( id => posts[id]).filter( post => post.isPublic )
);
我怀疑这部分在任何选择器中似乎都是多余的
(posts) => Object.keys(posts).map(id => posts[id])
我想过getPostsEntities
直接返回数组,但我在理解什么是最佳实践时遇到了一些问题
解决方案
正如@HMR 所提到的,您可以在另一个内部使用一个重新选择选择器。所以getPublicPosts
可以根据记忆中的结果getPosts
。您也可以使用Object.values()
代替Object.keys()
.
const getPostsEntities = (state: State) => state.posts;
export const getPosts = createSelector(
[ getPostsEntities ],
(posts) => Object.values(posts)
);
export const getPublicPosts = createSelector(
[ getPosts ],
(posts) => posts.filter(post => post.isPublic)
);
推荐阅读
- javascript - elem.style.background 在我的笑话测试中没有被选中
- charles-proxy - 查询为空时如何使用Charles将请求映射到本地文件?
- python - 如何为与 PyInstaller 捆绑的 Windows、MacOS 和 Linux 应用程序创建快捷方式图标
- android - 无法导航到片段 - kotlin
- typescript - 如何为此去抖动功能编写测试?
- python - 查找一个文件上的行是否在 Python 中作为另一个文件的行中的单词出现
- python - 如何通过python脚本在Debian OS的控制台中填写docker登录信息
- flutter - 错误:flutter/lib/ui/ui_dart_state.cc(199) 未处理的异常:无法启动 Flutter 中的调用
- sql - 丰富一行取决于 Spark SQL 中另一行中的值
- python - 无法使用 sqlalchemy 调用存储过程?