React Redux Router Intl保持在intl状态和路由器状态

时间:2016-12-22 09:09:09

标签: reactjs redux react-router-redux intl react-intl

我有一个使用React,Redux,React-Router和Intl的应用程序(还有react-intl,react-intl-redux,react-router-redux,react-redux)。基本设置,没什么特别的,我猜。

<Provider store={store}>
  <IntlProvider>
    <Router history={history}>
      <Route path="/:language" component={App}>
        ...
      </Route>
    </Router>
  </IntlProvider>
</Provider>

import { intlReducer } from 'react-intl-redux';
import { routerReducer } from 'react-router-redux';

const rootReducer = combineReducers({
  routing: routerReducer,
  intl: intlReducer,
  ...
});

(语言=此处的语言环境) 在标题中,我有一个下拉列表,您可以从中控制应用程序的语言。该应用的网址还包含有关当前语言的信息。

如果网址为http://example.com/en/post,则标题语言菜单包含en作为所选选项。

每当我更改下拉值时,url和header菜单都应相应更改。

反面也应该是可用的:导航或只是打开特定路径的页面(也包括语言)将反映在intl状态。

通常我会这样做:

  • 我使用dispatch(push('/{newLanguage}/...

  • 更改了网址
  • 对于intl状态更改我使用dispatch(updateIntl({ locale, messages })) - 动作创建者updateIntl由react-intl-redux提供

但触发这两个动作对我的应用程序来说是不可行的,因为它会触发2个状态更改,这会产生2个渲染(+一些api交互)

问题是如何只触发一个动作才能使intl状态和路由器状态同步?或者如果我对解决这个问题的一个动作错了,那么优雅的解决方案是什么?

可能的解决方案:创建一个操作CHANGE_LANGUAGE并重写intlReducerrouterReducer以在触发时调整状态?

0 个答案:

没有答案