【发布时间】:2017-12-12 08:35:22
【问题描述】:
我的 Redux 存储是标准化的,即它非常平坦,每个实体类型都有自己的切片。
这是我的 Redux 商店的简化示例:
drawings
1: {name:'D1', thumbnailId: 33}
2: {name:'D2', thumbnailId: 34}
thumbnails
33: {filePath: 'path to local file'}
34: {filePath: null (i.e. needs to be downloaded)}
显示图纸的列表视图需要重新渲染相应的缩略图:
图纸切片发生变化,即新的、删除的或更新的图纸
任何引用的缩略图都会发生变化,即缩略图 34 最终会被下载(下载由 Redux-Saga 异步处理)
我当前的 mapStateToProps 显然存在缺陷,因为它从 Redux 商店中进行了过多的选择。这发生在实际视图获取其新道具之前,因此我无法通过shouldComponentUpdate 控制它。
我的应用中有几个地方需要更好的解决方案。
这是我有缺陷的 mapStateToProps(我正在使用 Immutable.js):
(state, ownProps) => {
const drawings = selectProjectDrawings(state, ownProps.projectId).map(drawing => {
const thumbnailFileGuid = drawing.get('thumbnailFileGuid');
if (!thumbnailFileGuid) return drawing;
const filePath = selectFile(state, thumbnailFileGuid).get(THUMBNAIL_FILE_PATH_FIELD);
return filePath ? drawing.set('_thumbnailFilePath', filePath) : drawing;
});
return {
drawings: drawings
};
}
编辑:
我目前的解决方案的一个非常糟糕的事情是我正在创建新的绘图对象,方法是使用 _thumbnailPath 来扩充它们。这意味着我无法比较 shouldComponentUpdate 中的对象引用,因为引用总是被更改。
能够比较对象引用是不改变对象的主要论据之一,但我用我有缺陷的解决方案放弃了这个机会。
【问题讨论】:
-
很难理解您想要实现的目标以及出了什么问题。您需要图纸列表+缩略图吗?还是只有一张图+缩略图?您的 mapStateToProps 的预期和实际结果是什么?
-
mapStateToProps 在商店更新时被调用。我的商店因很多原因而更新(通过传奇等与服务器同步的东西)。在每次商店更新时,我实际上是在创建一个带有缩略图的新图纸列表,这会强制图纸列表重新渲染(如果我不编写非常专业的 shouldComponentUpdate 的话)。我在想也许使用 Reselect 进行记忆可能是一个解决方案,但我更愿意听听其他人是如何做到这一点的,这样我就可以在我的应用程序中实现一个干净的概念。
标签: react-native redux