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

NextJS 13 App Router中如何更新动态路由参数?

问题描述

我有一条路由user/[userId]/forms,其layout.tsx中包含一个下拉选择菜单。该下拉菜单的选项值为不同表单的ID,用户选择选项后,我希望导航至user/[userId]/forms/[formId]。我当前的实现方式如下:

import { useRouter, usePathName, useParams } from "next/navigation";

const router = useRouter();
const pathName = usePathName();
const params = useParams();

const handleOnChange = (formId: string) => {
  if(params.formId) {
    router.push(pathName.replace(params.formId, formId)); //若已选中表单,则替换
  } else {
    router.push(`${pathName}/${formId}`); //若未选中表单,则跳转
  }
}

该方法可行,但手动实现的方式存在潜在风险,比如当URL中存在与formId匹配的字符串时,可能会被错误替换。请问是否有更优的方式来设置动态路由分段的值?

更优解决方案

直接基于已获取的userId参数构造目标路由,彻底规避字符串替换的风险:

import { useRouter, useParams } from "next/navigation";

const router = useRouter();
const params = useParams();

const handleOnChange = (formId: string) => {
  // 直接拼接正确的目标路由路径
  router.push(`/user/${params.userId}/forms/${formId}`);
}

无论当前处于user/[userId]/forms还是user/[userId]/forms/[oldFormId],该方式都会直接跳转到正确的目标路由,不会出现误替换的问题。

如果需要更严谨的路由生成(比如应对复杂路由结构),可以使用Next.js的generatePath工具函数,它会严格按照路由模板填充参数:

import { useRouter, useParams } from "next/navigation";
import { generatePath } from "next/router";

const router = useRouter();
const params = useParams();

const handleOnChange = (formId: string) => {
  const targetPath = generatePath("/user/[userId]/forms/[formId]", {
    userId: params.userId as string,
    formId: formId
  });
  router.push(targetPath);
}

generatePath能确保路由格式的正确性,完全避免手动拼接或替换带来的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 22:03:14