Adding a base URL to an app using Redux-Router + React-Router

后端 未结 4 1545
孤独总比滥情好
孤独总比滥情好 2020-12-29 08:35

I\'m using React-Router 1.0.0-rc3 together with Redux-Router 1.0.0-beta3.

When using React-Router, you can use useBasename with createHistory

相关标签:
4条回答
  • 2020-12-29 08:54

    You can create a function that wraps useBasename:

    const createHistoryWithBasename = (historyOptions) => {
      return useBasename(createHistory)({
        basename: '/app_name',
        ...historyOptions
      })
    }
    

    And pass it to compose:

    const store = compose(
      applyMiddleware(m1, m2, m3),
      reduxReactRouter({
        routes,
        createHistory: createHistoryWithBaseName
      }),
      devTools()
    )(createStore)(reducer);
    
    0 讨论(0)
  • 2020-12-29 08:56

    The API changes very often so this is what worked for me (I'm using the 2.0.3 version of redux-simple-router). I have defined the custom history in a separate file:

    import { useRouterHistory } from 'react-router'
    import { createHistory, useBasename } from 'history'
    import { baseUrl } from '../config'
    
    const browserHistory = useRouterHistory(useBasename(createHistory))({
      basename: "/appgen"
    });
    

    Now I need to initialize the store:

    import { syncHistory, routeReducer } from 'redux-simple-router'
    import browserHistory from '../misc/browserHistory'
    
    const rootReducer = combineReducers({
      // ...other reducers
      routing: routeReducer
    });
    
    const reduxRouterMiddleware = syncHistory(browserHistory);
    
    const finalCreateStore = compose(
      // ...other middleware
      applyMiddleware(reduxRouterMiddleware),
    )(createStore);
    
    
    const store = finalCreateStore(rootReducer, initialState);
    

    Eventually, you need to pass the history to the Router.

    import browserHistory from './misc/browserHistory'
    import routes from '../routes'
    
    export default class Root extends Component {
      static propTypes = {
        history: PropTypes.object.isRequired
      };
    
      render() {
        return (
          <Router history={browserHistory}>
            {routes}
          </Router>
        )
      }
    }
    

    Before I came up with this, I was using a manual solution. I defined my own Link component and my own redux action that were responsible for prepending the base URL. It might be useful for someone.

    Updated Link component:

    import React, { Component } from 'react'
    import { Link as RouterLink } from 'react-router'
    import { baseUrl } from '../config'
    
    export default class Link extends Component {
      render() {
        return <RouterLink {...this.props} to={baseUrl + '/' + this.props.to} />
      }
    }
    

    Custom action creator:

    import { routeActions } from 'redux-simple-router'
    import { baseUrl } from '../config'
    
    export function goTo(path) {
      return routeActions.push(baseUrl + '/' + path);
    }
    

    Updated root route:

    import { baseUrl } from './config'
    export default (
      <Route component={App} path={baseUrl}>
        //...nested routes
      </Route>
    );
    

    Note that these custom tools only support pushing updated paths, not the location descriptor object.

    0 讨论(0)
  • 2020-12-29 08:57

    A variant of Diego V's answer that worked for me (without knowing what I was doing):

    import { createHistory } from 'history'
    import { useRouterHistory } from 'react-router'
    ...
    
    const _browserHistory = useRouterHistory(createHistory)({
      basename: '/yourbase'
    })
    
    const store = createStore(_browserHistory, api, window.__data)
    const history = syncHistoryWithStore(_browserHistory, store)
    

    I was replacing:

    //const _browserHistory = useScroll(() => browserHistory)()
    
    0 讨论(0)
  • 2020-12-29 09:13

    For react-router v2 or v3 and using react-router-redux v4 instead of redux-router, the setup of the history object will look like this:

    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)
    

    The rest of the setup is as usual when there is no extra base URL.

    0 讨论(0)
提交回复
热议问题