У меня есть роутер, как показано ниже:
<Router history={hashHistory}>
<Route path="/" component={App}>
<IndexRoute component={Index}/>
<Route path="login" component={Login}/>
</Route>
</Router>
Вот чего я хочу добиться:
- Перенаправить пользователя,
/login
если он не вошел в систему - Если пользователь пытался получить доступ,
/login
когда он уже вошел в систему, перенаправьте его на root/
так что теперь я пытаюсь проверить состояние пользователя в App
«с componentDidMount
, а затем сделать что - то вроде:
if (!user.isLoggedIn) {
this.context.router.push('login')
} else if(currentRoute == 'login') {
this.context.router.push('/')
}
Проблема здесь в том, что я не могу найти API для получения текущего маршрута.
Я обнаружил, что эта закрытая проблема предлагается с использованием миксина Router.ActiveState и обработчиков маршрутов, но похоже, что эти два решения теперь устарели.
this.state.location.pathname
(вместо props).static contextTypes = { router: React.PropTypes.object }
Вы можете получить текущий маршрут, используя
const currentRoute = this.props.routes[this.props.routes.length - 1];
... что дает вам доступ к реквизитам из активного
<Route ...>
компонента самого низкого уровня .Дано...
<Route path="childpath" component={ChildComponent} />
currentRoute.path
возвращается'childpath'
иcurrentRoute.component
возвращаетсяfunction _class() { ... }
.источник
this.props.location
теряет эти настраиваемые свойства.this.props.routes.length - 2
Если вы используете историю, то Router поместит все в местоположение из истории, например:
this.props.location.pathname; this.props.location.query;
возьми?
источник
Начиная с версии 3.0.0, вы можете получить текущий маршрут, вызвав:
Пример кода ниже:
var NavLink = React.createClass({ contextTypes: { router: React.PropTypes.object }, render() { return ( <Link {...this.props}></Link> ); } });
источник
Для всех пользователей, у которых возникла такая же проблема в 2017 году, я решил ее следующим образом:
NavBar.contextTypes = { router: React.PropTypes.object, location: React.PropTypes.object }
и используйте это так:
componentDidMount () { console.log(this.context.location.pathname); }
источник
PropTypes
теперь это отдельная зависимость, подумал добавить:import PropTypes from 'prop-types'; ... NavBar.contextTypes = { router: PropTypes.object, location: PropTypes.object };
В
App.js
добавьте ниже код и попробоватьwindow.location.pathname
источник
Вы можете использовать опору isActive так:
const { router } = this.context; if (router.isActive('/login')) { router.push('/'); }
isActive вернет истину или ложь.
Протестировано с помощью response-router 2.7
источник
У меня работает точно так же:
... <MyComponent {...this.props}> <Route path="path1" name="pname1" component="FirstPath"> ... </MyComponent> ...
А затем я могу получить доступ к this.props.location.pathname в функции MyComponent.
Я забыл, что это был я ...))) Следующая ссылка описывает больше для панели навигации make и т.д .: реагировать на маршрутизатор this.props.location
источник
Попробуйте ухватиться за путь, используя:
document.location.pathname
В Javascript текущий URL можно использовать по частям. Проверить: https://css-tricks.com/snippets/javascript/get-url-and-url-parts-in-javascript/
источник