와 react-router
내가 사용할 수 있습니다 Link
기본적으로 처리 라우터 반응하는 링크를 생성하는 요소.
내부적으로 호출하는 것을 봅니다 this.context.transitionTo(...)
.
탐색을하고 싶습니다. 링크가 아니라 드롭 다운 선택 (예 :)입니다. 코드에서 어떻게 할 수 있습니까? 무엇입니까 this.context
?
나는 Navigation
mixin을 보았지만없이 이것을 할 수 mixins
있습니까?
답변
후크가있는 React Router v5.1.0
useHistory
React> 16.8.0 및 기능적 구성 요소를 사용하는 경우 React Router> 5.1.0에 새로운 후크가 있습니다.
import { useHistory } from "react-router-dom";
function HomeButton() {
const history = useHistory();
function handleClick() {
history.push("/home");
}
return (
<button type="button" onClick={handleClick}>
Go home
</button>
);
}
라우터 v4 반응
React Router v4를 사용하면 구성 요소 내에서 프로그래밍 방식으로 라우팅 할 수있는 세 가지 방법이 있습니다.
withRouter
고차 부품을 사용하십시오 .- 컴포지션 사용 및 렌더링
<Route>
- 를 사용하십시오
context
.
React Router는 대부분 history
라이브러리를 둘러싼 래퍼 입니다. 브라우저 및 해시 기록을 통해 브라우저와 history
의 상호 작용을 처리합니다 window.history
. 또한 전역 기록이없는 환경에 유용한 메모리 기록을 제공합니다. 이는 특히 모바일 앱 개발 ( react-native
) 및 노드를 사용한 단위 테스트에 유용합니다 .
history
인스턴스를 탐색하기위한 두 가지 방법이 있습니다 : push
와 replace
. history
를 방문한 위치의 배열로 생각 하면 배열에 push
새 위치를 추가하고 배열 replace
의 현재 위치를 새 위치로 바꿉니다. 일반적으로 push
탐색 할 때이 방법 을 사용하려고합니다 .
이전 버전의 React Router에서는 자체 history
인스턴스 를 작성해야 했지만 v4 <BrowserRouter>
에서는 <HashRouter>
, 및 <MemoryRouter>
구성 요소가 브라우저, 해시 및 메모리 인스턴스를 작성합니다. React Router는 라우터와 history
연결된 인스턴스 의 속성과 메서드를 컨텍스트 아래의 router
개체 아래에서 사용할 수있게 합니다.
1. withRouter
고차 부품 사용
withRouter
고차 성분을 분사 할 history
컴포넌트의 소품으로 개체. 이를 통해 를 처리하지 않고도 push
및 replace
메소드 에 액세스 할 수 있습니다 context
.
import { withRouter } from 'react-router-dom'
// this also works with react-router-native
const Button = withRouter(({ history }) => (
<button
type='button'
onClick={() => { history.push('/new-location') }}
>
Click Me!
</button>
))
2. 컴포지션을 사용하고 <Route>
<Route>
구성 요소는 일치하는 위치는 아니다. 경로없는 경로를 렌더링 할 수 있으며 항상 현재 위치와 일치합니다 . <Route>
구성 요소와 같은 소품을 통과 withRouter
당신이 액세스 할 수 있도록 history
관통 방법을 history
소품.
import { Route } from 'react-router-dom'
const Button = () => (
<Route render={({ history}) => (
<button
type='button'
onClick={() => { history.push('/new-location') }}
>
Click Me!
</button>
)} />
)
3. 문맥을 사용하십시오 *
그러나 당신은 아마해서는 안됩니다
마지막 옵션은 React의 컨텍스트 모델로 편안하게 작업 할 수있는 경우에만 사용해야하는 옵션입니다 (React의 컨텍스트 API는 v16부터 안정적 임).
const Button = (props, context) => (
<button
type='button'
onClick={() => {
// context.history.push === history.push
context.history.push('/new-location')
}}
>
Click Me!
</button>
)
// you need to specify the context type so that it
// is available within the component
Button.contextTypes = {
history: React.PropTypes.shape({
push: React.PropTypes.func.isRequired
})
}
1과 2는 구현하기에 가장 간단한 선택이므로 대부분의 경우 가장 좋은 선택입니다.
답변
React-Router 5.1.0+ 답변 (후크 사용 및 React> 16.8)
useHistory
기능 구성 요소 의 새로운 후크를 사용 하고 프로그래밍 방식으로 탐색 할 수 있습니다.
import { useHistory } from "react-router-dom";
function HomeButton() {
let history = useHistory();
// use history.push('/some/path') here
};
반응 라우터 4.0.0+ 답변
4.0 이상에서는 히스토리를 컴포넌트의 소품으로 사용하십시오.
class Example extends React.Component {
// use `this.props.history.push('/some/path')` here
};
참고 :이 컴포넌트가에 의해 렌더링되지 않은 경우 this.props.history는 존재하지 않습니다 <Route>
. <Route path="..." component={YourComponent}/>
YourComponent에 this.props.history가 있어야합니다.
반응 라우터 3.0.0+ 답변
3.0 이상에서는 라우터를 컴포넌트의 소품으로 사용하십시오.
class Example extends React.Component {
// use `this.props.router.push('/some/path')` here
};
반응 라우터 2.4.0+ 답변
2.4 이상에서는 상위 구성 요소를 사용하여 라우터를 구성 요소의 소품으로 가져옵니다.
import { withRouter } from 'react-router';
class Example extends React.Component {
// use `this.props.router.push('/some/path')` here
};
// Export the decorated class
var DecoratedExample = withRouter(Example);
// PropTypes
Example.propTypes = {
router: React.PropTypes.shape({
push: React.PropTypes.func.isRequired
}).isRequired
};
반응 라우터 2.0.0+ 답변
이 버전은 1.x와 역 호환되므로 업그레이드 안내서가 필요하지 않습니다. 예제를 살펴 보는 것만으로도 충분합니다.
즉, 새로운 패턴으로 전환하려면 라우터 내부에 액세스 할 수있는 browserHistory 모듈이 있습니다.
import { browserHistory } from 'react-router'
이제 브라우저 기록에 액세스 할 수 있으므로 밀어 넣기, 바꾸기 등의 작업을 수행 할 수 있습니다.
browserHistory.push('/some/path')
반응 라우터 1.xx 답변
나는 세부 사항을 업그레이드하지 않을 것입니다. 업그레이드 안내서 에서 이에 대해 읽을 수 있습니다
여기서 질문에 대한 주요 변경 사항은 탐색 믹스 인에서 기록으로 변경되었습니다. 이제 브라우저 historyAPI를 사용하여 경로를 변경하므로 앞으로 사용할 것 pushState()
입니다.
다음은 Mixin을 사용하는 예입니다.
var Example = React.createClass({
mixins: [ History ],
navigateToHelpPage () {
this.history.pushState(null, `/help`);
}
})
이주의 History
에서 온다 rackt / 역사 프로젝트. React-Router 자체가 아닙니다.
ES6 클래스로 인해 어떤 이유로 Mixin을 사용하지 않으려면 라우터에서 가져온 기록에 액세스 할 수 있습니다 this.props.history
. 라우터에서 렌더링 한 구성 요소에만 액세스 할 수 있습니다. 따라서 하위 구성 요소에서 사용하려면를 통해 속성으로 전달해야합니다 props
.
1.0.x 설명서 에서 새 릴리스에 대한 자세한 내용을 읽을 수 있습니다
컴포넌트 외부 탐색에 대한 도움말 페이지 는 다음과 같습니다.
참조를 잡고 history = createHistory()
호출 하는 것이 좋습니다 replaceState
.
반응 라우터 0.13.x 답변
나는 같은 문제에 봉착했고 반응 라우터와 함께 제공되는 Navigation 믹스 인 솔루션 만 찾을 수있었습니다.
내가 한 방법은 다음과 같습니다
import React from 'react';
import {Navigation} from 'react-router';
let Authentication = React.createClass({
mixins: [Navigation],
handleClick(e) {
e.preventDefault();
this.transitionTo('/');
},
render(){
return (<div onClick={this.handleClick}>Click me!</div>);
}
});
transitionTo()
액세스 할 필요없이 전화를 걸 수있었습니다.context
아니면 당신은 멋진 ES6를 시도 할 수 있습니다 class
import React from 'react';
export default class Authentication extends React.Component {
constructor(props) {
super(props);
this.handleClick = this.handleClick.bind(this);
}
handleClick(e) {
e.preventDefault();
this.context.router.transitionTo('/');
}
render(){
return (<div onClick={this.handleClick}>Click me!</div>);
}
}
Authentication.contextTypes = {
router: React.PropTypes.func.isRequired
};
반응 라우터 루덕
참고 : Redux 를 사용하는 경우 React-Redux 와 동일한 접근 방식을 사용하여 ReactRouter에 대한 redux 바인딩을 제공하는
React-Router-Redux 라는 또 다른 프로젝트
가 있습니다.
React-Router-Redux에는 액션 제작자 내부를 간단하게 탐색 할 수있는 몇 가지 방법이 있습니다. 이는 React Native에 기존 아키텍처가있는 사람들에게 특히 유용 할 수 있으며, 보일러 플레이트 오버 헤드를 최소화하면서 React Web에서 동일한 패턴을 활용하고자합니다.
다음 방법을 탐색하십시오.
push(location)
replace(location)
go(number)
goBack()
goForward()
다음은 Redux-Thunk 사용 예입니다 .
./actioncreators.js
import { goBack } from 'react-router-redux'
export const onBackPress = () => (dispatch) => dispatch(goBack())
./viewcomponent.js
<button
disabled={submitting}
className="cancel_button"
onClick={(e) => {
e.preventDefault()
this.props.onBackPress()
}}
>
CANCEL
</button>
답변
반응 라우터 v2
가장 최근 릴리스 ( v2.0.0-rc5
)의 경우 권장 탐색 방법은 기록 싱글 톤을 직접 푸시하는 것입니다. 구성 요소 외부 탐색 문서 에서 실제로 작동하는 것을 볼 수 있습니다 .
관련 발췌 :
import { browserHistory } from 'react-router';
browserHistory.push('/some/path');
최신 반응 라우터 API를 사용하는 경우 컴포넌트 내부 history
에서 from 을 사용해야합니다 this.props
.
this.props.history.push('/some/path');
또한 제공 pushState
하지만 기록 된 경고에 따라 더 이상 사용되지 않습니다.
를 사용 react-router-redux
하면 다음 push
과 같이 전달할 수 있는 기능을 제공합니다 .
import { push } from 'react-router-redux';
this.props.dispatch(push('/some/path'));
그러나 이것은 실제로 페이지를 탐색하지 않고 URL을 변경하는 데만 사용될 수 있습니다.
답변
ES6을 사용 react-router v2.0.0
하여 이를 수행하는 방법은 다음과 같습니다 . 믹스 인에서 멀어졌습니다.react-router
import React from 'react';
export default class MyComponent extends React.Component {
navigateToPage = () => {
this.context.router.push('/my-route')
};
render() {
return (
<button onClick={this.navigateToPage}>Go!</button>
);
}
}
MyComponent.contextTypes = {
router: React.PropTypes.object.isRequired
}
답변
반응 라우터 4.x 답변 :
결국에는 구성 요소 외부에서도 수행 할 수있는 단일 기록 개체를 갖고 싶습니다. 내가 좋아하는 것은 주문형으로 가져 와서 조작하는 하나의 history.js 파일을 갖는 것입니다.
BrowserRouter
라우터 로 변경 하고 히스토리 소품을 지정하기 만하면 됩니다. 원하는대로 조작 할 수있는 고유 한 히스토리 오브젝트가 있다는 점을 제외하고는 아무것도 변경되지 않습니다.
에 의해 사용되는 라이브러리 인 history 를 설치해야합니다 react-router
.
사용법 예, ES6 표기법 :
history.js
import createBrowserHistory from 'history/createBrowserHistory'
export default createBrowserHistory()
BasicComponent.js
import React, { Component } from 'react';
import history from './history';
class BasicComponent extends Component {
goToIndex(e){
e.preventDefault();
history.push('/');
}
render(){
return <a href="#" onClick={this.goToIndex}>Previous</a>;
}
}
2018 년 4 월 16 일 수정 :
실제로 Route
컴포넌트 에서 렌더링 된 컴포넌트를 탐색해야하는 경우 다음 과 같이 소품에서 히스토리에 액세스 할 수도 있습니다.
BasicComponent.js
import React, { Component } from 'react';
class BasicComponent extends Component {
navigate(e){
e.preventDefault();
this.props.history.push('/url');
}
render(){
return <a href="#" onClick={this.navigate}>Previous</a>;
}
}
답변
이 경우 서버 측을 제어하지 않고 해시 라우터 v2를 사용하는 사람은 다음과 같습니다.
당신의 장소 역사를 (예를 들어 app_history.js ES6) 별도의 파일로 :
import { useRouterHistory } from 'react-router'
import { createHashHistory } from 'history'
const appHistory = useRouterHistory(createHashHistory)({ queryKey: false });
export default appHistory;
그리고 어디서나 사용하십시오!
반응 라우터의 진입 점 (app.js ES6) :
import React from 'react'
import { render } from 'react-dom'
import { Router, Route, Redirect } from 'react-router'
import appHistory from './app_history'
...
const render((
<Router history={appHistory}>
...
</Router>
), document.querySelector('[data-role="app"]'));
모든 구성 요소 (ES6) 내 탐색 :
import appHistory from '../app_history'
...
ajaxLogin('/login', (err, data) => {
if (err) {
console.error(err); // login failed
} else {
// logged in
appHistory.replace('/dashboard'); // or .push() if you don't need .replace()
}
})
답변
라우터 V4 반응
tl : dr;
if (navigate) {
return <Redirect to="/" push={true} />
}
간단하고 선언적인 답변은 다음 <Redirect to={URL} push={boolean} />
과 함께 사용해야합니다 .setState()
push : boolean- true 인 경우 경로 재 지정은 현재 항목을 바꾸는 대신 새 항목을 내역으로 푸시합니다.
import { Redirect } from 'react-router'
class FooBar extends React.Component {
state = {
navigate: false
}
render() {
const { navigate } = this.state
// here is the important part
if (navigate) {
return <Redirect to="/" push={true} />
}
// ^^^^^^^^^^^^^^^^^^^^^^^
return (
<div>
<button onClick={() => this.setState({ navigate: true })}>
Home
</button>
</div>
)
}
}
여기에 전체 예제가 있습니다 . 자세한 내용은 여기를 참조 하십시오 .
추신. 이 예에서는 ES7 + Property Initializer 를 사용 하여 상태를 초기화합니다. 관심이 있으시면 여기도 보십시오 .