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.