Redux传奇:如何确保只有我的传奇才能更新某个状态?

时间:2019-09-05 00:53:53

标签: react-native redux react-redux redux-saga

我有一个用React Native制作的移动应用程序,在使用Redux / Redux Saga时遇到了很多次最佳实践难题。如果我能得到别人对此的想法,我会很乐意。

对于我要实现的一项新功能,我需要能够知道该应用已启动了多少次。这涉及异步检索应用程序先前从设备存储启动的次数。如果要进行新的发布,我还需要在电话号码上加上+1并将其存储在设备存储中。

这是我目前的操作方式:

  1. 在应用启动时调度appLaunched()操作。

  2. Redux Saga参加了比赛。

  3. Inside Saga:检索设备存储中先前启动应用程序( appLaunchCount )的次数(等待异步完成)。

  4. 为先前的appLaunchCount添加+1。

  5. 将新的appLaunchCount存储在设备存储中(等待异步完成)。

  6. 使用新的appLaunchCount将put()分配给减速器。

  7. 在reducer中使用新的appLaunchCount更新状态。

此方法的问题是第6步。从技术上讲,我的应用程序的任何部分都可以使用任何整数将新的应用程序启动计数分派给我的reducer,即使reducer没出现,reducer也会更新状态。来自传奇。

我的问题是:我如何保护我的Reducers / Sagas / Actions,以便只有我的传奇才能使用当前的appLaunchCount来分发该动作?

P.S我能想到的唯一解决方案是将saga和reducer写入同一文件,并使用只有saga和reducer可以访问的私有操作。我真的很讨厌必须将所有代码放在一起。

1 个答案:

答案 0 :(得分:1)

私人行动并不是真的。根据设计,商店是全局对象。而且,由于动作只是具有type属性的对象,因此原则上可以构造正确类型的动作对象的任何人都可以调度动作并启动您的reducer。

您可以做的是使操作具有一种类型,以使其明显是私有的。例如,动作可能如下:

{
  type: '__PRIVATE_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED__'
  // You could tone it down a bit from this :)
}

那当然不会使其真正成为私人的,但是至少如果有人想要使用它,他们就不可能没有意识到你的意图。

如果您想使其更安全,则可以将符号用作类型,因此,只有有权使用该符号的任何人才能构造正确的操作。例如:

const appLaunchCount = new Symbol('appLaunchCount');

// action would look like:
{
  type: appLaunchCount
}

但是问题是要确保该符号保持隐藏状态,并且只有想要访问它的用户才能访问它。与您提到的内容类似,如果在同一文件中包含saga / reducer,则可以确保其他文件无法访问此符号;但是一旦开始导出,它将变得更加难以控制。