首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >重选回忆录忽略不相关的更新

重选回忆录忽略不相关的更新
EN

Stack Overflow用户
提问于 2016-12-22 15:28:05
回答 2查看 958关注 0票数 2

按照重新选择的文档上的示例:

代码语言:javascript
运行
复制
import { createSelector } from 'reselect'

const shopItemsSelector = state => state.shop.items

const subtotalSelector = createSelector(
  shopItemsSelector,
  items => items.reduce((acc, item) => acc + item.value, 0)
)

在一个典型的redux应用程序中,如果用户更新了subtotalSelector,即使这对结果没有影响,item.name也会重新计算。有什么办法可以避免这种情况吗?

EN

回答 2

Stack Overflow用户

发布于 2016-12-23 02:31:58

有两种解决办法:

  1. 甭管他们。除非您有大量的项,否则浏览器的计算能力足以处理重计算。
  2. 将价格与项目对象分开。也就是说,您有state.shop.items.itemNames(包含id名称对)和state.shop.items.itemValues(包含id值对)。然后,只有itemValues传递给选择器。
票数 1
EN

Stack Overflow用户

发布于 2017-05-25 00:35:36

我有一个类似的问题,我已经找到了一种黑客绕过它。

我有一组复杂的过滤器,还有大量的项目需要过滤。过滤状态的一部分包括显示状态。我想忽略显示状态的变化,这样我就不会一直过滤一个庞大的列表。这是一个简单的解决方案:

代码语言:javascript
运行
复制
const getFilters = createSelector(
    state => state.filters,
    filters => {
        const filtersWithoutDisplay = {};
        const ignoreObj = { collapsed: null };
        for (let filterGroup in filters) {
            filtersWithoutDisplay[filterGroup] = Object.assign({}, filters[filterGroup], ignoreObj);
        }
        // We create a new object every time, so this cannot be memoized properly unless we stringify.
        return JSON.stringify(filtersWithoutDisplay);
    }
);

它返回一个必须被解析的JSON字符串,但是它是一个原语,因此作为另一个选择器的输入,如果实际的内容不改变,它不会触发recomputation。这是一次黑客攻击。

您还可以在选择器函数之外定义一个对象,并且始终保持相同的引用,根据相同的模式更改内部,然后通过引入createSelectorCreator使用自定义的深度相等检查,如这里所解释的那样。这可能是一个更好的方法,但正如它所说:

始终检查替代equalityCheck函数或状态更新函数中的深度相等检查的成本不大于每次重新计算的成本。

这也适用于JSON.stringify黑客。我不会为大名单这么做,但是为了过滤器,当然。

在我的情况下,重构我的状态可能更好,因为筛选值可能是与筛选器显示设置不同的问题,而且这可能不是我唯一希望它们分开的时候。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41286546

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档