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

Next.js动态路由页面如何获取URL路径中的searchText参数?

Next.js 获取动态路由参数解决方案

针对你用Next.js实现/search/[searchText]动态路由获取参数的问题,以下是对应不同路由体系的可行方案:

一、Pages Router 场景(pages目录下的路由)

你之前误用了React Router的工具,Next.js Pages Router有自己的路由API,别搞混:

1. 服务端直接获取参数(推荐,适合直接查数据库)

在pages/search/[searchText]/index.tsx中使用getServerSideProps,服务端渲染阶段就能拿到参数,无需等待客户端 hydration:

// pages/search/[searchText]/index.tsx
export async function getServerSideProps(context) {
  // 直接从context.params中提取动态参数
  const { searchText } = context.params;
  
  // 这里直接调用数据库查询逻辑,比如:
  // const searchResults = await db.query('SELECT * FROM items WHERE title LIKE ?', [`%${searchText}%`]);
  
  return {
    props: {
      searchText,
      // searchResults // 把查询结果传给页面组件
    }
  };
}

function SearchPage({ searchText }) {
  // 直接使用服务端传来的参数
  return <div>当前搜索关键词:{searchText}</div>;
}

export default SearchPage;

2. 客户端路由钩子获取

如果需要在客户端处理逻辑,用Next.js自带的useRouter钩子(来自next/router,不是react-router):

// pages/search/[searchText]/index.tsx
import { useRouter } from 'next/router';

function SearchPage() {
  const router = useRouter();
  // 从router.query中拿到动态参数
  const { searchText } = router.query;

  // 处理客户端 hydration 时参数未加载的情况
  if (!searchText) {
    return <div>加载中...</div>;
  }

  // 这里可以用useEffect配合searchText做客户端查询(比如调用API)
  // useEffect(() => {
  //   fetch(`/api/search?q=${searchText}`).then(res => res.json()).then(data => {
  //     // 处理结果
  //   });
  // }, [searchText]);

  return <div>当前搜索关键词:{searchText}</div>;
}

export default SearchPage;

二、App Router 场景(app目录下的路由)

如果你的项目用的是Next.js 13+的App Router体系,动态路由文件为app/search/[searchText]/page.tsx,获取方式更简洁:

1. 服务端组件直接拿参数(默认推荐)

App Router的page组件默认是服务端组件,直接通过params入参获取:

// app/search/[searchText]/page.tsx
// 服务端组件,无需加'use client'
async function SearchPage({ params }: { params: { searchText: string } }) {
  const { searchText } = params;
  
  // 直接在服务端执行数据库查询
  // const searchResults = await db.searchItems(searchText);

  return (
    <div>
      当前搜索关键词:{searchText}
      {/* <div>搜索结果:{JSON.stringify(searchResults)}</div> */}
    </div>
  );
}

export default SearchPage;

2. 客户端组件获取参数

如果需要做客户端交互(比如输入框、状态管理),加'use client'指令后用useParams钩子:

// app/search/[searchText]/page.tsx
'use client';

import { useParams } from 'next/navigation';

function SearchPage() {
  const params = useParams();
  const searchText = params.searchText as string;

  if (!searchText) {
    return <div>加载中...</div>;
  }

  // 客户端查询逻辑
  return <div>当前搜索关键词:{searchText}</div>;
}

export default SearchPage;

为什么你之前的方法失败?

  • window.location.href报错:Next.js存在服务端渲染阶段,此时window对象还未生成,直接访问会报错,只能在客户端hydration完成后使用(不推荐用这个拿路由参数)。
  • React Router的ServerRouter无效:Next.js有独立的路由实现,不需要引入react-router的路由组件,必须用Next.js自带的路由API。
  • useEffect不生效:大概率是因为你用了错误的路由工具导致参数未正确获取,或者在服务端渲染阶段useEffect不会执行,需要配合Next.js的路由钩子确保参数加载完成。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 02:20:25