📜  满足 url 参数 react-router 的限制值 - Javascript (1)

📅  最后修改于: 2023-12-03 14:56:10.266000             🧑  作者: Mango

满足 URL 参数 react-router 的限制值

在使用 React-Router 的过程中,我们经常需要处理 URL 参数。而有时候,我们希望对这些参数进行限制,比如只允许某些特定的值。本文将介绍如何满足 React-Router 的 URL 参数限制值。

限制 URL 参数的值

React-Router 提供了 Route 组件来匹配和渲染 URL。我们可以在 Route 上使用 path 属性来指定 URL 匹配规则。同时,我们也可以在 path 中使用参数来匹配动态的 URL。

举例来说,我们想要渲染一个页面来显示用户的个人信息,那么我们可以定义如下的路由规则:

<Route path="/users/:id" component={UserProfile} />

在这个规则中,:id 表示 URL 上的参数。这个参数可以通过组件的 props 对象进行访问。

function UserProfile(props) {
  const userId = props.match.params.id;
  // ...
}

但是,如果我们不希望这个参数可以任意取值,而是要进行限制,怎么办呢?

React-Router 提供了一个叫做 path-to-regexp 的库,用于将路径字符串转换成匹配规则。

我们可以使用这个库来定义一个带参数的路由规则,并限制参数的取值范围。

import { Route } from "react-router";
import pathToRegexp from "path-to-regexp";

const idPattern = /^[1-9]\d*$/; // 只允许正整数

const path = "/users/:id";
const keys = [];
const re = pathToRegexp(path, keys);

function validateParams(params) {
  const match = re.exec(params);
  if (!match) {
    return false;
  }
  const values = match.slice(1);
  const namedParams = keys.reduce((result, key, index) => {
    result[key.name] = values[index];
    return result;
  }, {});
  return idPattern.test(namedParams["id"]);
}

function UserProfile(props) {
  const userId = props.match.params.id;
  // ...
}

function Users() {
  return (
    <Route path={path}>
      {({ match, location }) => {
        if (!match) {
          return null;
        }
        const params = location.pathname.substr(match.url.length);
        if (!validateParams(params)) {
          return <div>Invalid ID</div>; // 参数不合法
        }
        return <UserProfile {...props} />;
      }}
    </Route>
  );
}

在上面的代码中,我们首先定义了一个正则表达式,用于检验 ID 是否为正整数。

然后,我们通过 path-to-regexp 将路径字符串转成了一个可以匹配 URL 的正则表达式。同时,我们还把路由规则中的参数名称保存在了 keys 数组中。

validateParams 函数中,我们先使用该正则表达式来匹配 URL 中的参数。然后,我们将参数和参数名称对应起来,并调用验证函数来检验 ID 是否合法。

最后,在 Users 组件中,我们使用 Routechildren 属性来匹配路径,并将 matchparams 传递给子组件。子组件可以通过 props.match.params 访问 URL 参数。而我们通过 validateParams 来检验参数是否合法,在参数不合法的时候渲染一个错误信息。

结论

通过使用 path-to-regexp 库,我们可以定义一个带参数的路由规则,并限制参数的取值范围。这样可以减少潜在的安全风险,同时也可以提高用户体验。