Javascript 反应路由器重新渲染路由而不是重新渲染组件

Javascript 反应路由器重新渲染路由而不是重新渲染组件,javascript,redux,react-router,Javascript,Redux,React Router,我正在开发一个使用React Router的应用程序,我注意到当我的Redux应用商店更改状态时,路由器正在重新呈现当前路由所指的组件,而不是重新呈现路由本身 说明问题;我已经实现了一个privaterout,它检查用户当前是否登录。最基本的形式是这样的: const PrivateRoute = ({component: Component, ...rest}) => { return <Route {...rest} render={(props) => { c

我正在开发一个使用React Router的应用程序,我注意到当我的Redux应用商店更改状态时,路由器正在重新呈现当前路由所指的组件,而不是重新呈现路由本身

说明问题;我已经实现了一个
privaterout
,它检查用户当前是否登录。最基本的形式是这样的:

const PrivateRoute = ({component: Component, ...rest}) => {
  return <Route {...rest} render={(props) => {
    const state = store.getState()

    if (state.isAuthenticated) {
      return <Component {...props}/>
    }
    else {
      return <Redirect to={{pathname: '/login'}}/
    }
  }}/>
})
<PrivateRoute path="/" component={HomePage}/>
const PrivateRoute=({component:component,…rest})=>{
返回{
const state=store.getState()
如果(state.isAuthenticated){
返回
}
否则{
返回
})
这非常有效,因为我现在可以这样说:

const PrivateRoute = ({component: Component, ...rest}) => {
  return <Route {...rest} render={(props) => {
    const state = store.getState()

    if (state.isAuthenticated) {
      return <Component {...props}/>
    }
    else {
      return <Redirect to={{pathname: '/login'}}/
    }
  }}/>
})
<PrivateRoute path="/" component={HomePage}/>

然而,我注意到,当
的状态被验证时,React Router会调用
HomePage
组件上的
render
方法,而不是重新呈现路由。这意味着应用程序只会在用户从某个页面转到主页时执行身份验证检查,而不是一次e在主页上,不再执行检查

目前唯一的解决方法是将身份验证检查移动到组件的
render
函数中(显然它不属于该函数)


当状态发生变化时,如何使React Router重新呈现路由,而不是重新呈现路由所指的组件?

我通过使用高阶组件而不是在路由中实施身份验证检查来解决问题

function withEnsureAuthentication(WrappedComponent) {
  return class extends React.Component {
    render() {
      if (this.props.store.isAuthenticated === false) {
        return <Redirect to={{pathname: '/login'}}/>
      }

      return <WrappedComponent {...this.props}/>
    }
  }
}

您无法将
PrivateRoute
连接到authenticate状态,而只能从存储变量获取状态?我相信呈现树只是没有意识到基于某些状态更改的
PrivateRoute
内部的更改。我不理解您评论的第一句话/问题。我怀疑React路由器只调用路由的渲染方法一次(当路由路径被点击时)。之后,它将不再对路由调用render,而只对路由返回的组件调用render。我认为这是React路由器中的一个问题。我正在寻找一个优雅的解决方法。我主要建议您在回答中实际做了什么,nl让道具传播:)