Я пытаюсь сделать ПРОСТОЙ с помощью response-router ( версия ^ 1.0.3 ) для перенаправления на другое представление, и я просто устаю.
import React from 'react';
import {Router, Route, Link, RouteHandler} from 'react-router';
class HomeSection extends React.Component {
static contextTypes = {
router: PropTypes.func.isRequired
};
constructor(props, context) {
super(props, context);
}
handleClick = () => {
console.log('HERE!', this.contextTypes);
// this.context.location.transitionTo('login');
};
render() {
return (
<Grid>
<Row className="text-center">
<Col md={12} xs={12}>
<div className="input-group">
<span className="input-group-btn">
<button onClick={this.handleClick} type="button">
</button>
</span>
</div>
</Col>
</Row>
</Grid>
);
}
};
HomeSection.contextTypes = {
location() {
React.PropTypes.func.isRequired
}
}
export default HomeSection;
все, что мне нужно, это отправить использование в '/ login' и все.
Что я могу сделать ?
ошибки в консоли:
Uncaught ReferenceError: PropTypes не определен
файл с моими маршрутами
// LIBRARY
/*eslint-disable no-unused-vars*/
import React from 'react';
/*eslint-enable no-unused-vars*/
import {Route, IndexRoute} from 'react-router';
// COMPONENT
import Application from './components/App/App';
import Contact from './components/ContactSection/Contact';
import HomeSection from './components/HomeSection/HomeSection';
import NotFoundSection from './components/NotFoundSection/NotFoundSection';
import TodoSection from './components/TodoSection/TodoSection';
import LoginForm from './components/LoginForm/LoginForm';
import SignupForm from './components/SignupForm/SignupForm';
export default (
<Route component={Application} path='/'>
<IndexRoute component={HomeSection} />
<Route component={HomeSection} path='home' />
<Route component={TodoSection} path='todo' />
<Route component={Contact} path='contact' />
<Route component={LoginForm} path='login' />
<Route component={SignupForm} path='signup' />
<Route component={NotFoundSection} path='*' />
</Route>
);
javascript
reactjs
Реагируя
источник
источник
routes
определения, а также, если есть причина, по которой вы не используетеLink
компонент? Также укажите, какие ошибки вы получаете.<Link to="/login">Log In</Link>
?Uncaught ReferenceError
, вы вызываете какPropTypes
, но вы не импортируете это, вам нужно импортировать PropTypes как таковой или использоватьReact.PropTypes
react-router
изменение api в течение 5 минут .. хаха, шучу, но только частичноОтветы:
Для простого ответа вы можете использовать
Link
компонент изreact-router
вместоbutton
. Есть способы изменить маршрут в JS, но, похоже, вам это не нужно.<span className="input-group-btn"> <Link to="/login" />Click to login</Link> </span>
Чтобы сделать это программно в 1.0.x, вы делаете это внутри своей функции clickHandler:
this.history.pushState(null, 'login');
Взято из документа по обновлению здесь
Вы должны были
this.history
разместить в своем компоненте обработчика маршрутовreact-router
. Если это дочерний компонент ниже указанного вroutes
определении, вам может потребоваться передать его дальше.источник
if (true) { // redirect to login}
вот почему я помещаю это в onClick function{validation && <Link to="/login" />Click to login</Link>}
. Если проверка ложна, ничего не будет отображаться.1) react-router> V5
useHistory
hook:Если у вас есть
React >= 16.8
и функциональные компоненты, вы можете использоватьuseHistory
ловушку от response-router .import React from 'react'; import { useHistory } from 'react-router-dom'; const YourComponent = () => { const history = useHistory(); const handleClick = () => { history.push("/path/to/push"); } return ( <div> <button onClick={handleClick} type="button" /> </div> ); } export default YourComponent;
2) реактивный маршрутизатор> V4
withRouter
HOC:Как упоминал @ambar в комментариях, React-router изменил свою кодовую базу с момента выпуска V4. Вот документация - официальная , с роутером
import React, { Component } from 'react'; import { withRouter } from "react-router-dom"; class YourComponent extends Component { handleClick = () => { this.props.history.push("path/to/push"); } render() { return ( <div> <button onClick={this.handleClick} type="button"> </div> ); }; } export default withRouter(YourComponent);
3) React-router <V4 с
browserHistory
Вы можете добиться этой функциональности с помощью response-router
BrowserHistory
. Код ниже:import React, { Component } from 'react'; import { browserHistory } from 'react-router'; export default class YourComponent extends Component { handleClick = () => { browserHistory.push('/login'); }; render() { return ( <div> <button onClick={this.handleClick} type="button"> </div> ); }; }
4) Redux
connected-react-router
Если вы подключили свой компонент с помощью redux и настроили маршрутизатор connected-response-router, все, что вам нужно сделать, это
this.props.history.push("/new/url");
то есть вам не нуженwithRouter
HOC для инъекцииhistory
в свойства компонента.// reducers.js import { combineReducers } from 'redux'; import { connectRouter } from 'connected-react-router'; export default (history) => combineReducers({ router: connectRouter(history), ... // rest of your reducers }); // configureStore.js import { createBrowserHistory } from 'history'; import { applyMiddleware, compose, createStore } from 'redux'; import { routerMiddleware } from 'connected-react-router'; import createRootReducer from './reducers'; ... export const history = createBrowserHistory(); export default function configureStore(preloadedState) { const store = createStore( createRootReducer(history), // root reducer with router state preloadedState, compose( applyMiddleware( routerMiddleware(history), // for dispatching history actions // ... other middlewares ... ), ), ); return store; } // set up other redux requirements like for eg. in index.js import { Provider } from 'react-redux'; import { Route, Switch } from 'react-router'; import { ConnectedRouter } from 'connected-react-router'; import configureStore, { history } from './configureStore'; ... const store = configureStore(/* provide initial state if any */) ReactDOM.render( <Provider store={store}> <ConnectedRouter history={history}> <> { /* your usual react-router v4/v5 routing */ } <Switch> <Route exact path="/yourPath" component={YourComponent} /> </Switch> </> </ConnectedRouter> </Provider>, document.getElementById('root') ); // YourComponent.js import React, { Component } from 'react'; import { connect } from 'react-redux'; ... class YourComponent extends Component { handleClick = () => { this.props.history.push("path/to/push"); } render() { return ( <div> <button onClick={this.handleClick} type="button"> </div> ); } }; } export default connect(mapStateToProps = {}, mapDispatchToProps = {})(YourComponent);
источник
react-router-dom
делаетНапример, когда пользователь щелкает ссылку,
<Link to="/" />Click to route</Link>
маршрутизатор будет искать,/
и вы можете использоватьRedirect to
и отправить пользователя в другое место, например, маршрут входа.Из документации для ReactRouterTraining :
import { Route, Redirect } from 'react-router' <Route exact path="/" render={() => ( loggedIn ? ( <Redirect to="/dashboard"/> ) : ( <PublicHomePage/> ) )}/>
<Redirect to="/somewhere/else"/>
<Redirect to={{ pathname: '/login', search: '?utm=your+face', state: { referrer: currentLocation } }}/>
источник
<Redirect> elements are for router configuration only and should not be rendered
.Самое простое решение для Интернета!
До 2020 года
подтверждена работа с:
"react-router-dom": "^5.1.2" "react": "^16.10.2"
Используйте
useHistory()
крючок!import React from 'react'; import { useHistory } from "react-router-dom"; export function HomeSection() { const history = useHistory(); const goLogin = () => history.push('login'); return ( <Grid> <Row className="text-center"> <Col md={12} xs={12}> <div className="input-group"> <span className="input-group-btn"> <button onClick={goLogin} type="button" /> </span> </div> </Col> </Row> </Grid> ); }
источник
С помощью response-router v2.8.1 (возможно, также и других версий 2.xx, но я не тестировал) вы можете использовать эту реализацию для перенаправления маршрутизатора.
import { Router } from 'react-router'; export default class Foo extends Component { static get contextTypes() { return { router: React.PropTypes.object.isRequired, }; } handleClick() { this.context.router.push('/some-path'); } }
источник
Самое простое решение:
import { Redirect } from 'react-router'; <Redirect to='/componentURL' />
источник