Según tengo entendido, <Route path="/" component={App} />
will da App
accesorios relacionados con el enrutamiento como location
y params
. Si mi App
componente tiene muchos componentes secundarios anidados, ¿cómo consigo que el componente secundario tenga acceso a estos accesorios sin:
- pasando accesorios de la aplicación
- usando el objeto de la ventana
- crear rutas para componentes secundarios anidados
Pensé this.context.router
que tendría alguna información relacionada con las rutas, pero this.context.router
parece que solo tiene algunas funciones para manipular las rutas.
javascript
reactjs
react-router
xiaofan2406
fuente
fuente
Respuestas:
(Actualización) V5.1 y Hooks (Requiere React> = 16.8)
Puede usar
useHistory
,useLocation
yuseRouteMatch
en su componente para obtenermatch
,history
ylocation
.const Child = () => { const location = useLocation(); const history = useHistory(); const match = useRouteMatch("write-the-url-you-want-to-match-here"); return ( <div>{location.pathname}</div> ) } export default Child
(Actualización) V4 y V5
Puede utilizar
withRouter
hoc a fin de inyectarmatch
,history
ylocation
en sus apoyos componentes.class Child extends React.Component { static propTypes = { match: PropTypes.object.isRequired, location: PropTypes.object.isRequired, history: PropTypes.object.isRequired } render() { const { match, location, history } = this.props return ( <div>{location.pathname}</div> ) } } export default withRouter(Child)
(Actualización) V3
Puede utilizar
withRouter
hoc a fin de inyectarrouter
,params
,location
,routes
en sus apoyos componentes.class Child extends React.Component { render() { const { router, params, location, routes } = this.props return ( <div>{location.pathname}</div> ) } } export default withRouter(Child)
Respuesta original
Si no desea usar los accesorios, puede usar el contexto como se describe en la documentación de React Router
Primero, tienes que configurar tu
childContextTypes
ygetChildContext
class App extends React.Component{ getChildContext() { return { location: this.props.location } } render() { return <Child/>; } } App.childContextTypes = { location: React.PropTypes.object }
Luego, podrá acceder al objeto de ubicación en sus componentes secundarios usando el contexto como este
class Child extends React.Component{ render() { return ( <div>{this.context.location.pathname}</div> ) } } Child.contextTypes = { location: React.PropTypes.object }
fuente
context.router
window.location.pathname
?window
objeto no existe si el código React se ejecuta en el servidor, por ejemplo, para implementar el enrutamiento del lado del servidor.Si la solución anterior no le funcionó, puede usar
import { withRouter } from 'react-router-dom';
Con esto, puede exportar su clase secundaria como:
class MyApp extends Component{ // your code } export default withRouter(MyApp);
Y tu clase con Router -
// your code <Router> ... <Route path="/myapp" component={MyApp} /> // or if you are sending additional fields <Route path="/myapp" component={() =><MyApp process={...} />} /> <Router>
fuente