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

I ' ve sometimes seen people wrap their components in withRouter when they are exporting them:

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żyć?
Author: Tholle, 2018-11-29

4 answers

Kiedy dołączasz komponent strony głównej do aplikacji, często jest on zawinięty w komponent <Route>, taki jak ten:

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

W ten sposób komponent MoviesIndex ma dostęp do this.props.history, dzięki czemu może 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ą zawinięte w <Route>:
render() {
  return (<Header />);
}

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

Aby obejść ten problem, komponent nagłówka może być zawinięty w withRouter funkcja, albo gdy jest eksportowana:

export default withRouter(Header)

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

 212
Author: LondonRob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-11-29 15:16:17

withRouter jest komponentem wyższego rzędu, który przechodzi przez właściwości match, current location i history do zawiniętego komponentu za każdym razem, gdy jest renderowany. po prostu łączy komponent z routerem.

Nie wszystkie komponenty, zwłaszcza współdzielone komponenty, będą miały dostęp do rekwizytów takiego routera. Wewnątrz zawiniętych komponentów można uzyskać dostęp do location prop i uzyskać więcej informacji, takich jak location.pathname lub przekierować użytkownika do innego adresu URL za pomocą this.props.history.push.

Oto kompletny przykład ze 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 .

 52
Author: Muhammad Soliman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-07-06 14:56:37

withRouter komponent wyższego rzędu pozwala uzyskać dostęp do Właściwości obiektu history i najbliższego dopasowania <Route>. withRouter przejdzie zaktualizowany match, location, i history rekwizyty do zawiniętego komponentu za każdym razem, gdy renderuje.

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);
 12
Author: Gideon Kitili,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-10-28 09:17:38

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

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

I tak samo mecz i lokacja, aby móc zmienić lokację i użyć tego.rekwizyty.historia.push powinien być dostarczony dla każdej właściwości komponentu, ale gdy jest używany z routerem, może to być dostęp do lokalizacji i dopasowanie 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.

 1
Author: Mohammed_Alreai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-08-06 10:07:56