【问题标题】:hide id or query string while passing through react router通过反应路由器时隐藏id或查询字符串
【发布时间】:2018-08-25 12:44:45
【问题描述】:

我有传递 id 的路线,但我不想在 url 中显示 id,

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

这将在 url https://local..../invite-members/5 中转换, 但我想要https://local..../invite-members,但功能应该保持不变

使用反应路由器"react-router-dom": "^4.2.2",

【问题讨论】:

  • 这是要求,是不能泄露的秘密ID
  • 也许你应该生成一个临时令牌,这取决于你想要做什么......

标签: reactjs react-router router react-router-v4 react-router-redux


【解决方案1】:

如果您想将 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,您可以在其中存储组 ID

【讨论】:

    【解决方案2】:

    params 对象中传递数据将始终导致该数据显示在 URL 中。因为params 对象是从 url 构建的。

    【讨论】:

    • 所以有没有其他的替代方法
    • 您可以尝试通过将路径更改为 invite-members/:groupID? 来使 groupID 可选,我不确定您的服务器设置是否知道您是否可以发布 groupID
    • 我认为 Gabriel 将 ID 转换为令牌的建议可能是您最好的选择。您可以为此使用 jwt 库
    【解决方案3】:

    我可能有一个非常简单的解决方案:

    路由器链接:

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

    在目标文件中:

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

    然后启动需要 ID 的查询。它没有出现在网址中。

    【讨论】:

      猜你喜欢
      • 2017-06-26
      • 2017-01-06
      • 2022-01-16
      • 2016-07-06
      • 2017-08-14
      • 2022-01-10
      • 2017-05-07
      • 2018-02-17
      • 2019-08-20
      相关资源
      最近更新 更多