将hashrouter添加到路由会使'push'停止渲染组件

Pab*_*ada 3 javascript reactjs react-router redux

我有一个ConnectedRouter,我想向所有路由添加哈希,所以我添加了HashRouter组件,如下所示:

// @flow
import React from 'react';

import { Router, Route,Switch } from 'react-router'
import { HashRouter } from 'react-router-dom'
import { ConnectedRouter } from 'react-router-redux';
import { routerActions } from 'react-router-redux';
import { UserAuthWrapper } from 'redux-auth-wrapper';
import StudiesViewContainer from './components/views/studies/StudiesViewContainer';
import NotificationsViewContainer from './components/views/notifications/NotificationsViewContainer';
import UserView from './components/views/user/UserView';
import StudyViewContainer from './components/views/studies/StudyViewContainer';
import { getUser } from './reducers';
import LoginView from './components/views/login';
import NotFoundView from './components/views/notFound';
import ForbiddenView from './components/views/forbidden';

const UserIsAuthenticated = UserAuthWrapper({
  authSelector: getUser,
  redirectAction: routerActions.replace,
  failureRedirectPath: '/',
  wrapperDisplayName: 'UserIsAuthenticated'
});

const configRouter = (history: Object) => {
  return () =>
    <ConnectedRouter history={ history }>
      <HashRouter>
        <Switch>
          <Route path="/studies" component={ StudiesViewContainer } />
          <Route path="/study/:id" component={ StudyViewContainer } />
          <Route path="/user"  component={ UserView } />
          <Route path="/notifications" component={ NotificationsViewContainer } />
          <Route path="/forbidden" component={ ForbiddenView } />
          <Route path="/not-found" component={ NotFoundView } />
          <Route path="/" component={ LoginView } />
          <Route path="*" component={ NotFoundView } />
        </Switch>
      </HashRouter>
    </ConnectedRouter>
};

export default configRouter;
Run Code Online (Sandbox Code Playgroud)

问题是当我做这样的事情时:

push('studies')
Run Code Online (Sandbox Code Playgroud)

该路由不添加哈希值,并且不会呈现新组件.

我将浏览器历史记录添加到我的商店,这是configureStore文件:

// @flow
import { createStore, applyMiddleware, compose } from 'redux';
import thunk from 'redux-thunk';
import createHistory from 'history/createBrowserHistory'
import { routerMiddleware } from 'react-router-redux';
import createSagaMiddleware from 'redux-saga'
import {
  persistStore,
  autoRehydrate,
  createTransform
} from 'redux-persist';

import mainSaga from '../sagas';
import reducer from '../reducers';

const history = createHistory();
const routingMiddleware = routerMiddleware(history);
const sagaMiddleware = createSagaMiddleware();

// Remove error field from persisted auth substate
let authTransform = createTransform(
  (inboundState, key) =>
    key === 'auth' ?
      { ...inboundState, error: undefined }:
      inboundState,
  outboundState => outboundState,
  {
    whitelist: [
      'auth',
      'permissions'
    ]
  }
);

const configureStore = (): Promise<*> => {
  let middlewares = [routingMiddleware,thunk, sagaMiddleware ];
  let composeEnhancers = compose;

  if(process.env.NODE_ENV !== 'production') {
    composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;
  }

  const store = createStore(
    reducer,
    composeEnhancers(
      applyMiddleware(...middlewares),
      autoRehydrate()));

  sagaMiddleware.run(mainSaga);

  return new Promise(resolve => {
    persistStore(
      store, {
        whitelist: ['auth', 'permissions'],
        debounce: 500,
        transforms: [
          authTransform
        ]
      },
      () => resolve({ store, history })
    );
  });
};

export default configureStore;
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮我push按预期工作吗?

我在包json中使用以下版本的路由器:

"react-router": "^4.2.0",
"react-router-dom": "^4.2.2",
"react-router-redux": "next",
Run Code Online (Sandbox Code Playgroud)

F. *_*cky 7

我有类似的问题,我通过使用解决了它

从'history/createHashHistory ' 导入createHistory

代替

从'history/createBrowserHistory ' 导入createHistory

https://github.com/ReactTraining/react-router/blob/master/packages/react-router/docs/guides/blocked-updates.md中的建议导出组件时也添加了路由器


Vla*_*ost 1

我将浏览器历史记录添加到我的商店中,这是configureStore文件:

该问题很可能在于history路由器中使用的 -object 和 redux 状态中建议的 -object 之间的差异。然后在 redux side 中创建历史记录const history = createHistory();,它似乎没有与ConnectedRouter对象链接,但它后面不能跟随假定的代码。

如果将有效history对象传递给ConnectedRouter,请尝试检查后续路由器操作是否会被saga进程或其他中间件拦截。尝试通过https://github.com/gaearon/redux-devtools工具跟踪发出操作流程。

您还可以尝试通过添加具有完整生命周期的根组件(从React.Component类继承)来执行手动更新,并添加以下代码:

this.props.history.listen((location, action) => {
  console.log("on route change");
});
Run Code Online (Sandbox Code Playgroud)

然后你可以发现路由器状态是否发生变化,如果采取行动,只需执行forceUpdate根组件中的方法即可。另请参阅此文档:https://github.com/ReactTraining/react-router/blob/master/packages/react-router/docs/guides/blocked-updates.md