다른 뷰로 리디렉션하기 위해 react-router ( 버전 ^ 1.0.3 )를 사용하여 A SIMPLE을 수행하려고하는데 피곤해집니다.
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;
내가 필요한 것은 ‘/ 로그인’에 사용을 보내는 것뿐입니다.
어떡해 ?
콘솔 오류 :
포착되지 않은 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>
);
답변
간단한 대답을 위해 대신 Link
에서 구성 요소를 사용할 수 있습니다 . JS에서 경로를 변경하는 방법이 있지만 여기서는 필요하지 않은 것 같습니다.react-router
button
<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
정의에 언급 된 하위 구성 요소 아래에있는 경우 추가로 전달해야 할 수 있습니다.
답변
1) 반응 라우터> V5 useHistory
후크 :
React >= 16.8
기능적인 구성 요소 가있는 경우 useHistory
react-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 이후로 코드 기반을 변경했습니다. 여기에 문서화입니다 – 공식 , withRouter
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 with browserHistory
react-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와 구성 요소를 연결 한 및 구성한 경우 연결-반응 라우터 당신이해야 할 모든 것입니다
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를 사용하여 다른 경로로 리디렉션하는 방법은 무엇입니까?
예를 들어 사용자가 링크를 클릭하면 <Link to="/" />Click to route</Link>
react-router가 찾아서 로그인 경로와 같은 다른 곳에서 사용자를 /
사용 Redirect to
하고 보낼 수 있습니다 .
ReactRouterTraining에 대한 문서 에서 :
를 렌더링하면
<Redirect>
새 위치로 이동합니다. 새 위치는 서버 측 리디렉션 (HTTP 3xx)과 마찬가지로 기록 스택의 현재 위치를 재정의합니다.
import { Route, Redirect } from 'react-router'
<Route exact path="/" render={() => (
loggedIn ? (
<Redirect to="/dashboard"/>
) : (
<PublicHomePage/>
)
)}/>
to : string, 리디렉션 할 URL입니다.
<Redirect to="/somewhere/else"/>
to : object, 리디렉션 할 위치입니다.
<Redirect to={{
pathname: '/login',
search: '?utm=your+face',
state: { referrer: currentLocation }
}}/>
답변
가장 쉬움웹을위한 솔루션!
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>
);
}
답변
react-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' />