Скрыть идентификатор или строку запроса при прохождении через реагирующий маршрутизатор

У меня есть маршрут, где я передаю идентификатор, но я не хочу показывать идентификатор в URL,

`<Route path={`${match.url}invite-members/:groupID`} exact component={InviteMembers} />`

это конвертируется в URL https:/invite-members/5, но вместо этого я хочу https:/invite-members, но функциональность должна оставаться такой же, как в я получаю идентификатор в приглашениях через this.props.match.params.groupID должно быть как есть, помогите пожалуйста

используя реагирующий маршрутизатор "react-router-dom": "^4.2.2",

2 ответа

Возможно, у меня есть очень простое решение:

Ссылка на маршрутизатор:

 <Link to={{pathname: '/item/'+name, state : {id}}}>{name}</Link>

В целевом файле:

 state = this.props.location.state

 QueryParameters = () => {
     const id = this.state.id
     return { id }
  }

И запустите свой запрос, требующий ID. Он не отображается в URL-адресе.

Если вы хотите изменить URL-адрес на "/ Invite-members", вы можете добавить компонент Redirect. И в случае, если вы хотите сохранить groupId, вы можете сохранить его в состояние вашего компонента:

import React, { PureComponent } from "react";
import PropTypes from "prop-types";
import {
  Router,
  Route,
  Link,
  Switch,
  Redirect
} from "react-router-dom";

class Root extends PureComponent {
  // add groupId field to your component
  // In case you use redux or any another state management library, you can save groupId to store
  state = { groupId: null };
  render() {
    const { store, history } = this.props;
    // just for example I defined '/' path to redirect on /invite-members url
    return (
        <Router>
          <Switch>
            <Route
              path="/"
              exact
              render={props => (
                <Redirect
                  to={{
                    pathname: "/invite-members/123",
                    state: { from: props.location }
                  }}
                />
              )}
            />
            <Route
              path="/invite-members"
              exact
              render={props => (
                <InviteMembers {...props} groupId={this.state.groupId} />
              )}
            />
            <Route
              path="/invite-members/:groupID"
              exact
              render={props => {
                return (
                  <RedirectAndSaveGroupId
                    {...props}
                    groupId={props.match.params.groupID}
                    onSetGroupId={groupId => {
                      this.setState({ groupId });
                    }}
                  />
                );
              }}
            />
          </Switch>
        </Router>
    );
  }
}

export default Root;

class RedirectAndSaveGroupId extends PureComponent {
  componentDidMount() {
    // save groupId to Root component
    this.props.onSetGroupId(this.props.groupId);
  }

  render() {
    // redirect to /invite-members without groupId
    return (
      <Redirect
        to={{
          pathname: "/invite-members",
          state: { from: this.props.location }
        }}
      />
    );
  }
}

// Just for demo. In this.props.groupId we can receive groupId
class InviteMembers extends PureComponent {
  render() {
    return this.props.groupId;
  }
}

Обратите внимание, что если вы используете какую-либо библиотеку управления состоянием, такую ​​как Redux, вы можете хранить в них идентификатор группы

Передача данных в params Объект всегда приводит к тому, что эти данные отображаются в URL. Поскольку params Объект построен из URL.

Другие вопросы по тегам