You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Router Dom中如何检测URL是否包含指定片段(如id参数)

实现步骤

1. 调整路由配置

首先把匹配User组件的路由路径调整为可选id参数,React Router v5/v6 都支持在参数后加?表示可选,示例路由配置:

// React Router v6 示例
<Route path="/user/:id?" element={<User />} />

配置完成后,访问/user(新增场景,无id)和/user/123(编辑场景,有id)都会命中User组件。

2. 调整组件逻辑

你代码中已经通过useParams()获取了id参数,当URL中无id片段时,id的值为undefined,直接判断其是否存在即可替换原来的method判断逻辑,同时给props解构加兜底默认值避免新增场景下的报错:

const User = (props) => {
  // 加兜底默认值,避免新增场景下props.location.user不存在导致解构报错
  const { 
    name = '', 
    email = '', 
    status = 'active', 
    gender = '', 
    title = ''
  } = props.location?.user || {};

  const { id } = useParams();

  const [newName, setNewName] = useState(name);
  const [newEmail, setNewEmail] = useState(email);
  const [newStatus, setNewStatus] = useState(status);
  const [newGender, setNewGender] = useState(gender);

  const updateName = (e) => {
    setNewName(e.target.value);
  };

  const updateEmail = (e) => {
    setNewEmail(e.target.value);
  };

  const updateStatus = (e) => {
    setNewStatus(e.target.value);
  };

  const updateGender = (e) => {
    setNewGender(e.target.value);
  };

  const updateData = () => {
    // 替换原来的method判断,直接判断id是否存在
    if (id) {
      // 有id走put更新逻辑
      axios
        .put(
          `${process.env.REACT_APP_API_URL}users/${id}`,
          {
            name: newName,
            email: newEmail,
            status: newStatus,
            gender: newGender,
          },
          {
            headers: {
              Authorization: `Bearer ${process.env.REACT_APP_API_TOKEN}`,
            },
          }
        )
        .catch(function (error) {
          if (error.response.status === 422) {
            alert(
              "Error: The format of email is wrong! Please put it like this: yourname@yourname.com"
            );
          }
        });
    } else {
      // 无id走post新增逻辑
      axios
        .post(
          `${process.env.REACT_APP_API_URL}users/`,
          {
            name: newName,
            email: newEmail,
            status: newStatus,
            gender: newGender,
          },
          {
            headers: {
              Authorization: `Bearer ${process.env.REACT_APP_API_TOKEN}`,
            },
          }
        )
        .catch(function (error) {
          if (error.response.status === 422) {
            alert("Error: Name or email already taken!");
          }
        });
    }
  };

补充说明

如果需要严格校验id的有效性,可额外加/^\d+$/.test(id)的正则判断,避免URL传入非数字id的异常场景。

内容的提问来源于stack exchange,提问作者ahmedskulj10

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 09:06:02