垃圾收集Redux / Flux商店

时间:2015-11-06 10:04:52

标签: reactjs flux redux

我正处于一个项目中,我们目前正在使用Redux进行基于React的单页面应用程序中的状态管理,我们遇到了关于何时/如何清理我们商店中未使用数据的问题(技术上)子状态或全局Redux商店)。

例如,我们有一个日历“商店”,看起来像

calendar = {
    "2015-11-06": {
        // Loads of data
    },
    ... // More dates
}

大多数情况下,我们当时只关心一个日期,但有些情况下,不同的组件需要同时使用不同的日历日期。

问题是:“垃圾收集”商店是否有某种策略?

我最初的想法是,需要特定日历日期的组件必须“保留”该日期,当它卸载时,它将删除其预留。这样,当我们达到某种大小限制时,我们可以删除所有未被任何组件保留的日期。

这有点麻烦,因为它增加了在获取日期和组件卸载时处理“预留”的组件需求。

这是一个可行的策略还是有更好的选择?

2 个答案:

答案 0 :(得分:0)

对于WeakSetWeakMap来说,这是一个很好的用例。

  

WeakMap弱对其键的引用,意味着如果有的话   没有其他对其中一个键的引用,该对象受到约束   垃圾收集。

答案 1 :(得分:0)

所有这一切的关键在于这个陈述的组合:

  

大多数情况下,我们当时只关心一个日期,但有些情况下,不同的组件需要同时使用不同的日历日期。

......以及我们如何考虑像Flux / Redux这样的架构中的状态。

没有什么可以阻止你重建现有的数据存储:

calendar = {
    mainDate: {
        date: "2015-11-06",
        // Loads of data
    }
}

然后,只要您遇到需要多个日期的特殊情况之一,就会发出一个操作,将calendar状态替换为如下所示:

calendar = {
    mainDate: {
        date: "2015-11-06",
        // Loads of data
    },
    otherDate: {
        date: "2016-02-29",
        // Other data. Perhaps even less than the loads you'd have in mainDate
    }
}

在某个地方,您的组件会自行决定是否需要查看mainDateotherDate。 (他们可以很好地提取适当的内容,然后将内容传递给他们的子组件;您可能想在这里引入一个抽象层。)

当另一个组件使用另一个日期完成时,它将发出另一个生成:

的操作
calendar = {
    mainDate: {
        date: "2015-11-06",
        // Loads of data
    }
}

...因此自动处理您的垃圾收集问题。

显然,这里有很多实现细节,但这是针对你的情况的。关键概念是包含在任何给定时间运行应用程序所需的所有状态(以及状态),并使用操作从一个状态转换到另一个状态。