在哪里保持" currentUser"全球可访问

时间:2016-11-17 08:30:39

标签: redux

我状态树中的几乎每个对象都需要包含以下字段:

  • createdByGuid
  • createdAt
  • modifiedAt

日期字段很容易在动作创建者中添加。似乎已经达成共识,即行动创造者是允许不纯洁的地方,即new Date()

但是当前登录的用户不容易被提取,因为这些数据存在于该州的另一个片段中。

示例状态:

profile
  data
    guid
    firstname
    ...
media
  items
    0: guid, createdByGuid, ...
    1: guid, createdByGuid, ...
drawings
  items
    ...

当调度MEDIA_ADD操作时,我希望操作创建者使用createdById扩充调度的数据。需要从profile.data.guid获取当前用户。

我不想把这个州带入我的行动创作者。相反,我可以通过getState()使用thunk来获取状态。但这似乎是一种笨拙的方式来获得一个简单的guid常量(本次会话的常量)。当基本上所有用于向状态添加数据的动作创建者都需要成为thunk时,它变得更加笨拙。

我倾向于创建一个单独的全局单例对象来保存这些数据,并将此依赖关系带入我的所有动作创建器模块中。就例如测试而言,这似乎不那么令人不安了。

我想大多数Redux用户对当前用户都有同样的问题。什么是好的解决方案?

我正在使用react-native工作,但我认为这个问题适用于大多数Redux应用程序。

1 个答案:

答案 0 :(得分:0)

如果有人有兴趣,我会采用单身方式。根据定义,它不是真正的单身人士,但它符合我的需要。

当用户登录时,我在异步操作创建者(thunk)中处理此问题。在使用服务器成功验证用户后,thunk调用setGlobalCurrentUser()。

要掌握当前用户,我只需要从currentUser.js导入currentUserGuid(),而且我不会在依赖地狱中结束。

<强> currentUser.js:

let _currentUserGuid;

export function currentUserGuid() {
  if(!_currentUserGuid) throw new Error('currentUserGuid:: No logged in user')
  return _currentUserGuid;
}

export function setGlobalCurrentUser(user) {
  if(user) {
    _currentUserGuid = user.get('guid')
  } else {
    _currentUserGuid = null
  }
}