2016-11-10 3 views
1

У меня есть редуктор, который отслеживает какую-то дату в моем состоянии приложения. По умолчанию это текущая дата, полученная через library.js.Redux: глобальная конфигурация для редуктора

const selectedDateReducer = (state = moment(), action) => { 
    switch (action.type) { 
    case 'SET_DATE': 
     return action.date; 
    default: 
     return state; 
    } 
} 

Это работает хорошо, но теперь я хочу, чтобы все даты, чтобы быть в конкретной местности:

const selectedDateReducer = (state = moment().locale(globalLocale), action) => { 
    switch (action.type) { 
    case 'SET_DATE': 
     return action.date; 
    default: 
     return state; 
    } 
} 

Я также нуждаются в таком же локаль в моем React компоненте, поэтому я передаю это нравится:

<Component locale={globalLocale}></Component> 

и не хотите жестко кодировать его.

Глобальные переменные также не очень хорошо работают, поскольку их трудно переопределить во время тестов.

Если это не было частью инициации состояния, я мог бы просто передать его как часть какого-либо действия, но мне нужен globalLocale в моем коде инициализации редуктора.

Возможно, в этой конкретной ситуации я мог бы перемещать логику локали в другое место, но меня в основном интересует какой-то общий шаблон.

ответ

0

Вы просто сделаете модуль из него.

export const globalLocale = 'en'; 

Вы можете использовать его из любой точки, где это необходимо, просто импортировав его. Кроме того, вы можете сделать ее функцией, чтобы вы могли ее изменить в любое время. Тем не менее, это делает его состояние, поэтому оно должно быть помещено внутри Redux. Единственное исключение может быть, если вы установите его один раз во время инициализации, поскольку это все еще делает его постоянным в течение всего срока службы приложения.

let currentLocale = 'en'; 
export const globalLocale =() => currentLocale; 
export const setGlobalLocale = newLocale => currentLocale = newLocale; 

Теперь, поскольку это модуль, он действительно будет глобальным. Это означает, что если вы используете серверный ответ, все рендеринг сервера будет с одним и тем же языком. Решение состоит в том, чтобы просто использовать Redux.

В качестве побочного примечания: время - это объект, который отделен от того, как люди его называют. Он существует для всех нас одновременно. «Теперь» то же самое для вас и я, и для кого угодно, и для чего угодно на земле или в других местах.

Это означает, что установка языкового стандарта на дату не обязательно является хорошей идеей. Лучше хранить общую дату.

Кроме того, состояние обычно представляет собой простой объект. Экземпляр moment необязательно входит в состояние Redux.

Что бы больше смысла для меня, чтобы хранить либо Date (который сериализует с JSON.stringify или меткой временем Unix ((new Date()).getTime()) наряду с текущей локалью, которая будет приложением глобальное, потому что приложение было только одно канонического Redux состояние.

Затем вы делаете вспомогательную функцию, которая принимает дату и региональные параметры и форматирует дату в соответствии с текущей локали, с помощью moment, конечно, и использовать эту функцию в своих компонентах или в mapStateToProps.

Смежные вопросы