使用ReactRouter v4和redux将locale作为URL参数

时间:2018-02-01 14:24:41

标签: redux internationalization react-router-v4 react-router-redux react-redux-i18n

我正在使用React& amp;构建一个多语言应用程序。 Redux使用:

{
    "react": "16.2.0",
    "redux": "3.7.2",
    "react-redux": "^5.0.6",
    "react-router-redux": "^5.0.0-alpha.9",
    "react-router": "^4.2.0",
    "react-redux-i18n": "^1.9.1"
}

已解决(使用path-to-regexp):https://codesandbox.io/s/307nz4p9nm

编辑:最后能够渲染组件。最后的麻烦是我的语言选择器的路径生成。

我使用<ConnectedRouter />依赖createBrowserHistory()

我有以下结构:

// containers/App.jsx
<div>
    <ul>
        <li>
            <NavLink to={`${match.url}/`}>Home</NavLink>
        </li>
        <li>
            <NavLink to={`${match.url}/ABC`}>ABC</NavLink>
        </li>
        <li>
            <NavLink to={`${match.url}/DEF`}>DEF</NavLink>
        </li>
        <li>
            <NavLink to={`${match.url}/GHI`}>GHI</NavLink>
        </li>
        <li>
            <NavLink to={`${match.url}/JKL`}>JKL</NavLink>
        </li>
    </ul>
    <div>
        <Router />
    </div>
    <footer>
        <Link to={ (???) }>English</Link>
        <Link to={ (???) }>French</Link>
    </footer>
</div>

// containers/Router.jsx
<Switch>
    <Route exact path={`{match.url}/`} component={Home} />
    <Route exact path={`{match.url}/abc`} component={AbcComponent} />
    <Route exact path={`{match.url}/def`} component={DefComponent} />
    <Route exact path={`{match.url}/ghi`} component={GhiComponent} />
    <Route exact path={`{match.url}/jkl`} component={JklComponent} />
</Switch>

// containers/RootContainer.jsx
<Provider store={store}>
    <ConnectedRouter history={history}>
        <Switch>
            <Route path='/:locale(en|fr)' component={App} />
            <Redirect to='/en' />
        </Switch>
    </ConnectedRouter>
</Provider>

以这种方式呈现:

const store = createStore(combineReducers({}))
const history = createBrowserHistory()

ReactDOM.render(
    <RootContainer store={store} history={history} />,
    document.getElementById('app-container')
)

以下URI产生了哪些结果:

/
    /(en|fr)
        /abc
        /def
        /ghi
        /jkl

现在,我正在寻找一种实现我的语言环境选择器的方法:生成当前页面的路径,只更新:locale参数。

无论我正在访问的路线是什么(/en/en/abc),match.path总是返回/:locale(en|fr)而我永远不会访问子路径(例如/abc 1}})来自我的App组件。

然后如何挂钩react-redux-i18n以自动从URL获取区域设置而不是在自己的状态下管理它?

1 个答案:

答案 0 :(得分:1)

<Switch>仅适用于Route和Redirect作为直接后代。因此LocalizedRoute组件不起作用。

<ConnectedRouter basename=/:locale/ history={history} />

我不知道basename prop和不必要的imo,删除它。

您可以做的是使用动态路线:

<Route path="/:locale/<path>"/> 

并减少LOCATION_CHANGE操作中的区域设置参数。但是还有更多的解决方案,例如:

<Switch>
   <Route path="/en" component={SwitchMyRoutes} /> // No exact!!
   <Route path="/fr" render={(match,location)=> <SwitchMyRoutes locale="fr" match={match}/>} />
   <Route render={({location})=> <Redirect to={`/en/${location}`}/>}/>
</Switch>