react-router-dom:从<browserrouter>组件中获取props.location

时间:2017-11-15 02:15:50

标签: reactjs react-router-dom

我有一个简单的应用程序,它使用来自'react-router-dom'v4的BrowserRouter。我正在尝试从location.pathname组件中访问<BrowserRouter/>属性,但无效:

class App extends Component{
  render(){
    return (
      <BrowserRouter>
        // How do I access this.props.location?
        <div className={(this.props.location.pathnme === "/account") ? "bgnd-black" : "bgnd-white"} >
          <Switch>
            <Route path="/login" component={LoginPage}/>
            <Route path="/success" component={LoginSuccess}/>
            <Route path="/account" component={MyAccount}/>
            ...
            <Route component={Error404}/>
          </Switch>
        </div>
      </BrowserRouter>
    );
  }
}

我知道我可以使用this.props.location.pathname通过子组件访问应用程序的当前路径位置,但我需要从父组件访问它,就在<BrowserRouter/>下方以运行其他逻辑与儿童成分有关。我怎样才能获得这个位置?

3 个答案:

答案 0 :(得分:3)

react-router v5.1.0起,您可以使用useLocation

https://reactrouter.com/web/api/Hooks/uselocation

class App extends Component{
  render(){
    const location = useLocation();

    return (
      <div className={(location.pathname === "/account") ? "bgnd-black" : "bgnd-white"} >
        //...
      </div>
    );
  }
}

// ...
<BrowserRouter>
  <App />
</BrowserRouter>

答案 1 :(得分:2)

在深入了解他们的GitHub问题后,我找到了解决方案。我必须在<Route />内呈现<BrowserRouter />,并将我的应用的其余部分传递到render()函数中,其中history作为参数。在渲染功能中,我可以在history.location.pathname中找到该应用的位置。

class App extends Component{
  render(){
    return (
      <BrowserRouter>

        // We must add a parent <Route> and render its children while passing 'history' as parameter
        <Route path={Paths.reserve} render={(history) => 

          // Within render(), we can find it in history.location.pathname
          <div className={(history.location.pathname === "/account") ? "background-black" : "background-white"} >
            <Switch>
              <Route path="/login" component={LoginPage}/>
              <Route path="/success" component={LoginSuccess}/>
              <Route path="/account" component={MyAccount}/>
              ...
              <Route component={Error404}/>
            </Switch>
          </div>
          }/>
        }} />
      </BrowserRouter>
    );
  }
}

这将自动更新history参数,而无需在componentDidMount()componentDidUpdate()上重新呈现

答案 2 :(得分:1)

通过这样做,你实现了你所要求的

import AccessRoute from './AccessRoute'

class App extends Component{
  render(){
    return (
      <BrowserRouter>

  <AccessRoute>    
 <div className={(this.props.location.pathnme === "/account") ? "bgnd-black" : "bgnd-white"} >
          <Switch>
            <Route path="/login" component={LoginPage}/>
            <Route path="/success" component={LoginSuccess}/>
            <Route path="/account" component={MyAccount}/>
            ...
            <Route component={Error404}/>
          </Switch>
        </div>
       </AccessRoute>    
      </BrowserRouter>
    );
  }
}

AccessRoute.jsx

import React from 'react'
import {withRouter} from 'react-router';
class AccessRoute extends React.Component{
    constructor(props){
        super(props);
    }



 //If you want to find the location on mount use this 

 componentDidMount(){
        console.log("the path name is ",this.props.location.pathname);
    }


 //If you want to find the location on change use this

  componentDidUpdate(prevprops){
    if(this.props.location.pathname!=prevprops.location.pathname){
        console.log("the new path name is ",this.props.location.pathname);
    }

}

    render(){
        return(

            this.props.children

            );
    }
}
export default withRouter(AccessRoute)