2016-11-10 99 views
1

我有一个减速器,它在我的应用程序状态中跟踪某种日期。默认情况下,它是通过moment.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; 
    } 
} 

我还需要在我的阵营成分相同的语言环境,所以我通过它喜欢:

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

并且不想对其进行硬编码。

全局变量也不能正常工作,因为在测试过程中很难重新定义它们。

如果它不是国家启动的一部分,我可以通过它作为一些行动的一部分,但我需要我的reducer初始化代码中的globalLocale

也许,在这个特定的情况下,我可以移动语言环境逻辑到其他地方,但我最感兴趣的是某种通用模式。

回答

0

您只需制作一个模块即可。

export const globalLocale = 'en'; 

然后,您可以在任何需要它的地方通过导入它来使用它。或者,您可以将其设为功能,以便随时更改。但是,这使它成为状态,所以它应该放在Redux中。唯一的例外是,如果您在初始化时将其设置为一次,因为它仍然会在应用程序的生命周期内保持不变。

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

现在,因为它是一个模块,它真的是全球性的。这意味着如果您使用服务器端React,则所有渲染服务器都将使用相同的语言环境。那里的解决方案就是使用Redux。

附注:时间是一种与人类标记方式分开的实体。它同时存在于我们所有人。 “现在”对你和我以及世界上任何人或其他地方都是一样的。

这意味着在日期上设置语言环境不一定是个好主意。最好存储一个通用日期。

此外,状态通常只是一个普通的对象。 A moment实例不一定属于Redux状态。

将使什么最有意义的我是存储或者是Date(这是序列化与JSON.stringify或Unix时间戳((new Date()).getTime())与当前区域一起,这将是应用全局,因为应用程序只有一个规范的终极版状态。

然后你做一个辅助函数,它接受的日期和区域设置和格式根据当前语言环境的日期,用moment的帮助,当然,在你的组件或在您mapStateToProps使用此功能。