使用React Router和Redux Simple Router进行onEnter转换不会渲染新路由的组件

乔恩

我有一个使用react @ 0.14,redux @ 3.05,react-router @ 1.0.3和redux-simple-router @ 2.0.2的应用程序。我正在尝试根据商店状态为某些路线配置onEnter过渡。过渡挂钩成功触发并将新状态推送到我的商店,这将更改URL。但是,页面上呈现的实际组件是路由匹配中的原始组件处理程序,而不是新url的新组件处理程序。

这是我的routes.js文件的样子

export default function configRoutes(store) {
  const authTransition = function authTransition(location, replaceWith) {
    const state = store.getState()
    const user = state.user

    if (!user.isAuthenticated) {
      store.dispatch(routeActions.push('/login'))
    }
  }

  return (
    <Route component={App}>
      <Route path="/" component={Home}/>
      <Route path="/login" component={Login}/>
      <Route path="/dashboard" component={Dashboard} onEnter={authTransition}/>
      <Route path="/workouts" component={Workout} onEnter={authTransition}>
        <IndexRoute component={WorkoutsView}/>
        <Route path="/workouts/create" component={WorkoutCreate}/>
      </Route>
    </Route>
  )
}

这是我Root.js插入到DOM中的组件

export default class Root extends React.Component {
  render() {
    const { store, history } = this.props
    const routes = configRoutes(store)

    return (
      <Provider store={store}>
        <div>
          {isDev ? <DevTools /> : null}
          <Router history={history} children={routes} />
        </div>
      </Provider>
    )
  }
}

为了澄清,如果我转到“ / workouts”,它将触发onEnter authTransition钩子,调度redux-simple-router推送操作,将url更改为“ / login”,但将在页面上显示Workout组件。在Redux DevTools中查看显示state -> router -> location -> pathname为'/ login'。

状态流是

  1. @@在里面
  2. @@ ROUTER / UPDATE_LOCATION(/锻炼)
  3. @@ ROUTER / UPDATE_LOCATION(/登录)

我是否将商店错误地传递到路线?我不知道为什么下一个Router / Update_Location不起作用

乔恩

事实证明,您想使用react-router api(替换),而不是redux-simple-router来控制转换。

const authTransition = function authTransition(nextState, replace, callback) {
  const state = store.getState()
  const user = state.user

  // todo: in react-router 2.0, you can pass a single object to replace :)
  if (!user.isAuthenticated) {
    replace({ nextPathname: nextState.location.pathname }, '/login', nextState.location.query)
  }

  callback()
}

另外,要小心。我看到了很多文档,这些文档用于在您传递单个对象的地方替换react-router。这是针对react-router 2.0-rc *的。如果您使用react-router 1.0,则需要传递replace 3个单独的参数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用 React Router 渲染组件和 Redux 崩溃

使用react-router和redux容器组件对路由参数进行线程化

React-Testing-Library-使用Redux和Router包装组件

React Redux和react-router-dom

redux-simple-router + react-router错误“路由状态不存在”

Redux Simple Router-更改状态和URL

Redux和React-Router正确设置

混淆react-router-dom和react-router-redux

如何使用Redux和酶测试React Router参数

React Router和Redux Auth令牌双重渲染

私有路由 React Router 和 Redux

在if语句之后,React Router Link将不会更新路由

使用React Router和Router

无法使用React Router和React Bootstrap渲染组件

React Router 路由不渲染组件

React Router 改变路由但不渲染组件

路由/重定向不会在React Router 4和Redux授权中呈现

如何将React-Router UseRouterHistory与Redux-Simple-Router结合

如何使用react-redux与mapStateToProps,MapDispatchToProps和Redux-Router连接

react-router-redux和redux-immutable:您不能更改<Router history>;它将被忽略

React-Router-Redux和React-Bootstrap

推荐使用Redux和React-Router进行深度链接的方法

React Router和Redux-初始加载数据

Redux-loop和Connected-React-Router是否兼容?

结合 React Router 和 Redux 使我的重定向 KO

React工具包和Redux-First-Router

React Router重新渲染路由,而不是重新渲染组件

使用Redux,React和react-router-dom 4.x时从动态组件获取引用

让ReactTransitionGroup和Redux-Simple-Router一起工作