WithRouter dùng để làm gì trong react-router-dom?


107

Đôi khi tôi đã thấy mọi người bọc các thành phần của họ vào withRouterkhi họ xuất chúng:

import { withRouter } from 'react-router-dom';

class Foo extends React.Component {
  // ...
}

export default withRouter(Foo);

Cái này dùng để làm gì, và khi nào tôi nên dùng nó?

Câu trả lời:


182

Khi bạn bao gồm một thành phần trang chính trong ứng dụng của mình, nó thường được bao bọc trong một <Route>thành phần như sau:

<Route path="/movies" component={MoviesIndex} />

Bằng cách làm này, MoviesIndexthành phần có quyền truy cập để this.props.historynó có thể chuyển hướng người dùng với this.props.history.push.

Một số thành phần (thường là thành phần tiêu đề) xuất hiện trên mọi trang, vì vậy không được bao bọc trong <Route>:

render() {
  return (<Header />);
}

Điều này có nghĩa là tiêu đề không thể chuyển hướng người dùng.

Để khắc phục sự cố này, thành phần tiêu đề có thể được bao bọc trong một withRouterhàm, hoặc khi nó được xuất:

export default withRouter(Header)

Điều này cho phép Headerthành phần truy cập vào this.props.history, có nghĩa là bây giờ tiêu đề có thể chuyển hướng người dùng.


26
Như đã nêu trong câu trả lời của @ msoliman , withRoutercũng cấp quyền truy cập vào matchlocation. Sẽ rất tuyệt nếu câu trả lời được chấp nhận đề cập đến điều đó, vì chuyển hướng người dùng không phải là trường hợp sử dụng duy nhất withRouter. Đây là một sự tự qna tốt đẹp.
Michael Yaworski

Ngoài ra, nếu bạn cần <Link> và <NavLink> từ bộ định tuyến, bạn phải sử dụng withRouter HOC.
thewebjackal

Tôi nghĩ câu trả lời sẽ đầy đủ hơn nếu được đề cập tại sao historyhoặc matchkhông có mặt theo mặc định? tức là Tại sao withRouterphải được đề cập một cách rõ ràng?
Emran BatmanGhelich

43

withRouterlà một thành phần thứ tự cao hơn sẽ truyền tuyến đường match, hiện tại locationhistoryđạo cụ gần nhất đến thành phần được bao bọc bất cứ khi nào nó hiển thị. chỉ đơn giản là nó kết nối thành phần với bộ định tuyến.

Không phải tất cả các thành phần, đặc biệt là các thành phần dùng chung, sẽ có quyền truy cập vào các đạo cụ của bộ định tuyến đó. Bên trong các thành phần được bao bọc của nó, bạn sẽ có thể truy cập vào locationprop và nhận thêm thông tin như location.pathnamehoặc chuyển hướng người dùng đến các url khác bằng cách sử dụng this.props.history.push.

Đây là một ví dụ hoàn chỉnh từ trang github của họ:

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);

Thông tin thêm có thể được tìm thấy ở đây .


6

withRouterthành phần bậc cao hơn cho phép bạn truy cập vào các historythuộc tính của đối tượng và <Route>kết quả khớp gần nhất . withRoutersẽ vượt qua được cập nhật match, locationhistoryđạo cụ để các thành phần quấn bất cứ khi nào nó ám.

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);

Đọc thêm về vấn đề này ở đây - reacttraining.com/react-router/core/api/withRouter
Gideon Kitili

0

withRouter là một thành phần bậc cao sẽ vượt qua tuyến đường gần nhất để truy cập vào một số thuộc tính như vị trí và khớp từ các đạo cụ, nó chỉ có thể được truy cập nếu cung cấp cho thành phần thuộc tính nằm trong thành phần

<Route to="/app" component={helo} history ={history} />

và trùng khớp và độ thịnh vượng vị trí để có thể thay đổi vị trí và sử dụng this.props.history.push, nó phải được cung cấp cho mỗi thuộc tính thành phần phải cung cấp nhưng khi được sử dụng WithRouter, nó có thể được truy cập vào vị trí và khớp mà không cần thêm lịch sử thuộc tính. có thể được truy cập hướng mà không cần thêm lịch sử tài sản cho mỗi Tuyến đường.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.