Do czego służy withRouter w React-router-dom?


113

Mam czasami postrzegane ludzie owinąć ich komponentów w withRouterprzypadku ich wywozu są:

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

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

export default withRouter(Foo);

Do czego to służy i kiedy powinienem go używać?

Odpowiedzi:


195

Kiedy umieszczasz w aplikacji komponent strony głównej, często jest on opakowany w taki <Route>komponent:

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

W ten sposób MoviesIndexkomponent ma dostęp do, this.props.historyaby mógł przekierować użytkownika za pomocąthis.props.history.push .

Niektóre komponenty (zwykle komponent nagłówka) pojawiają się na każdej stronie, więc nie są opakowane w <Route>:

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

Oznacza to, że nagłówek nie może przekierować użytkownika.

Aby obejść ten problem, komponent nagłówka można opakować w withRouterfunkcję, gdy jest eksportowany:

export default withRouter(Header)

Daje to Headerdostęp do komponentu this.props.history, co oznacza, że ​​nagłówek może teraz przekierować użytkownika.


30
Jak stwierdzono w odpowiedzi @ msoliman , withRouterdaje również dostęp do matchi location. Byłoby miło, gdyby w akceptowanej odpowiedzi wspomniano o tym, ponieważ przekierowanie użytkownika nie jest jedynym przypadkiem użycia withRouter. Inaczej jest to fajna samo-qna.
Michael Yaworski

Ponadto, jeśli potrzebujesz <Link> i <NavLink> z routera, wymagane jest użycie withRouter HOC.
thewebjackal

Myślę, że odpowiedź byłaby bardziej kompletna, gdyby wspomniano, dlaczego domyślnie są obecne historylub matchnie? tj. dlaczego withRouternależy wyraźnie wspomnieć?
Emran BatmanGhelich

co jeśli zawiniemy komponent aplikacji przez BrowserRouter w index.js, to w ogóle nie będziemy wymagać withRouter, proszę zasugerować?
Kapil Yadav

46

withRouterjest komponentem wyższego rzędu, który przekaże najbliższą trasę match, bieżącą locationi historywłaściwości do opakowanego komponentu podczas renderowania. po prostu łączy komponent z routerem.

Nie wszystkie komponenty, zwłaszcza komponenty współdzielone, będą miały dostęp do właściwości routera. Wewnątrz jego opakowanych komponentów byłbyś w stanie uzyskać dostęp do locationwłaściwości i uzyskać więcej informacji, takich jak location.pathnamelub przekierować użytkownika do innego adresu URL za pomocą this.props.history.push.

Oto pełny przykład z ich strony 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);

Więcej informacji można znaleźć tutaj .


9

withRouterkomponent wyższego rzędu pozwala uzyskać dostęp do historywłaściwości obiektu i najbliższego <Route>dopasowania. withRouterprzekaże zaktualizowane match, locationi historyprops do opakowanego komponentu za każdym razem, gdy będzie renderowany.

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

Przeczytaj więcej na ten temat tutaj - Reacttraining.com/react-router/core/api/withRouter
Gideon Kitili

0

withRouter jest komponentem wyższego rzędu, który przejdzie najbliższą trasę, aby uzyskać dostęp do pewnej właściwości co do lokalizacji i dopasowania z właściwości, do których można uzyskać dostęp tylko wtedy, gdy nadasz komponentowi właściwość znajdującą się w komponencie

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

i to samo dopasowanie i dobrobyt lokalizacji, aby móc zmienić lokalizację i użyć this.props.history.push, należy to zapewnić dla każdej właściwości komponentu, którą musi zapewnić, ale gdy jest używany WithRouter może być dostęp do lokalizacji i dopasować bez dodawania historii właściwości. można uzyskać dostęp do kierunku bez dodawania historii właściwości dla każdej trasy.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.