使用Redux-Router + React-Router为应用程序添加基本URL

chi*_*ode 15 javascript reactjs react-router redux

我正在使用React-Router 1.0.0-rc3和Redux-Router 1.0.0-beta3.

使用React-Router时,您可以使用useBasenamewith createHistory来设置应用程序的基本URL,以便您可以轻松编写在子目录中运行的应用程序.示例:

而不是这个:

import { createHistory } from 'history';

let base = "/app_name/"

<Router history={browserHistory}>
  <Route path={base} component={App}></Route>
</Router>

<Link path={base + "some_path"}>some_path</Link>
Run Code Online (Sandbox Code Playgroud)

您可以使用以下方式编写useBasename:

import { createHistory, useBasename } from 'history';

const browserHistory = useBasename(createHistory)({
  basename: "/app_name"
});

<Router history={browserHistory}>
  <Route path="/" component={App}></Route>
</Router>

<Link path="/some_path">some_path</Link>
Run Code Online (Sandbox Code Playgroud)

但是,在Redux-Router中,您需要传递createHistory而不是history减速器:

const store = compose(
  applyMiddleware(m1, m2, m3),
  reduxReactRouter({
    routes,
    createHistory
  }),
  devTools()
)(createStore)(reducer);
Run Code Online (Sandbox Code Playgroud)

useBasename在这种情况下我们如何使用?

Die*_*o V 13

对于react-router v2或v3并使用react-router-redux v4而不是redux-router,历史对象的设置如下所示:

import { createHistory } from 'history'
import { useRouterHistory } from 'react-router'
import { syncHistoryWithStore } from 'react-router-redux'

const browserHistory = useRouterHistory(createHistory)({
  basename: '<yourBaseUrl>'
})
const history = syncHistoryWithStore(browserHistory, store)
Run Code Online (Sandbox Code Playgroud)

当没有额外的基本URL时,其余设置与往常一样.

  • 我只是使用相同的(旧)版本的`history`作为`react-router @ 2.8.1`来做:`history @ 2.1.2`.如果有人使用其中一个最新版本(例如`history @ 4.3.0`),请告诉我. (3认同)
  • @DamianoBarbati你不能仅仅因为它对你不起作用而拒绝这个答案_now_.这是对原始问题的正确书面答复.请成熟使用[down down](https://stackoverflow.com/help/privileges/vote-down)权限. (2认同)

chi*_*ode 2

您可以创建一个包装函数useBasename

const createHistoryWithBasename = (historyOptions) => {
  return useBasename(createHistory)({
    basename: '/app_name',
    ...historyOptions
  })
}
Run Code Online (Sandbox Code Playgroud)

并将其传递给compose

const store = compose(
  applyMiddleware(m1, m2, m3),
  reduxReactRouter({
    routes,
    createHistory: createHistoryWithBaseName
  }),
  devTools()
)(createStore)(reducer);
Run Code Online (Sandbox Code Playgroud)