나는 때때로 사람들 withRouter
이 그들을 내보낼 때 구성 요소를 감싸는 것을 보았습니다 .
import { withRouter } from 'react-router-dom';
class Foo extends React.Component {
// ...
}
export default withRouter(Foo);
이것은 무엇을위한 것이며 언제 사용해야합니까?
답변
앱에 기본 페이지 구성 요소를 포함하면 종종 <Route>
다음과 같은 구성 요소에 래핑됩니다 .
<Route path="/movies" component={MoviesIndex} />
이렇게하면 MoviesIndex
구성 요소가에 액세스 할 수 this.props.history
있으므로 this.props.history.push
.
일부 구성 요소 (일반적으로 헤더 구성 요소)는 모든 페이지에 표시되므로에 래핑되지 않습니다 <Route>
.
render() {
return (<Header />);
}
이는 헤더가 사용자를 리디렉션 할 수 없음을 의미합니다.
이 문제를 해결하려면 헤더 구성 요소를 withRouter
내보낼 때 함수 로 래핑 할 수 있습니다 .
export default withRouter(Header)
이렇게하면 Header
구성 요소에에 대한 액세스 권한 이 부여되므로 this.props.history
헤더가 이제 사용자를 리디렉션 할 수 있습니다.
답변
withRouter
렌더링 할 때마다 가장 가까운 경로의 match
, current location
및 history
props를 래핑 된 구성 요소에 전달하는 고차 구성 요소입니다 . 단순히 구성 요소를 라우터에 연결합니다.
모든 구성 요소, 특히 공유 구성 요소가 이러한 라우터의 소품에 액세스 할 수있는 것은 아닙니다. 래핑 된 구성 요소 내에서 location
prop 에 액세스 하여 더 많은 정보를 얻 location.pathname
거나을 사용하여 사용자를 다른 URL로 리디렉션 할 수 this.props.history.push
있습니다.
다음은 github 페이지의 전체 예입니다.
import React from "react";
import PropTypes from "prop-types";
import { withRouter } from "react-router";
// A simple component that shows the pathname of the current location
class ShowTheLocation 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>You are now at {location.pathname}</div>;
}
}
// Create a new component that is "connected" (to borrow redux
// terminology) to the router.
const ShowTheLocationWithRouter = withRouter(ShowTheLocation);
답변
withRouter
고차 구성 요소를 사용하면 history
객체의 속성과 가장 가까운 항목에 액세스 할 수 있습니다 <Route>
. 렌더링 할 때마다 withRouter
업데이트 된 match
, location
및 history
소품을 래핑 된 구성 요소에 전달 합니다.
import React from "react";
import PropTypes from "prop-types";
import { withRouter } from "react-router";
// A simple component that shows the pathname of the current location
class ShowTheLocation 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>You are now at {location.pathname}</div>;
}
}
// Create a new component that is "connected" (to borrow redux
// terminology) to the router.
const ShowTheLocationWithRouter = withRouter(ShowTheLocation);
답변
withRouter는 가장 가까운 경로를 통과하여 위치와 일치하는 속성에 대한 액세스 권한을 얻기 위해 구성 요소에있는 속성을 구성 요소에 제공하는 경우에만 액세스 할 수 있습니다.
<Route to="/app" component={helo} history ={history} />
일치와 위치 번영이 동일하게 위치를 변경할 수 있고 this.props.history.push를 사용할 수 있도록 각 구성 요소 속성에 대해 제공해야하지만 WithRouter를 사용하면 속성 히스토리를 추가하지 않고도 위치 및 일치에 액세스 할 수 있습니다. 각 Route에 속성 이력을 추가하지 않고도 방향에 액세스 할 수 있습니다.