2016-11-17 2 views
1

Почти каждый объект в моем дереве состояний должно иметь следующие поля:Где держать "CurrentUser" глобально доступным

  • 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.

Я не хочу приводить государство в свой создатель действия. Вместо этого я могу использовать thunk, чтобы получить состояние через getState(). Но это, кажется, неуклюжий способ получить простую константу guid (постоянную для этой сессии). Он становится более неуклюжим, когда по существу все мои создатели действия для добавления данных в состояние должны быть громкими.

Я склонен создать отдельный глобальный одноэлементный объект для хранения этих данных и приведения этой зависимости ко всем модулям создания моего действия. Это, по-видимому, намного менее тревожная зависимость с точки зрения, например, тестирования.

Я полагаю, что у большинства пользователей Redux примерно такой же вопрос относительно текущего пользователя. Что такое хорошее решение?

Я работаю в режиме реагирования, но я полагаю, что этот вопрос применим к большинству приложений Redux.

ответ

0

Если кто-то заинтересован, я пошел по этому пути с синглтон. Не настоящий синглтон на определение, но он подходит для моих потребностей.

Когда пользователь входит в систему, я обрабатываю это в асинхронном action creator (thunk). Thunk вызывает setGlobalCurrentUser() после успешной аутентификации пользователя с сервером.

Чтобы получить доступ к текущему пользователю, мне нужно импортировать currentUserGuid() из currentUser.js, и я не попадаю в адский ад.

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 
    } 
} 
Смежные вопросы