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

如何使用next/navigation的useRouter向其他页面传递对象?

在Next.js App Router中传递对象到目标页面

App Router 下的 useRouter(来自next/navigation)不支持 Pages Router 那种通过query字段传对象的写法,你可以用以下几种实用方式实现:

1. 通过URL查询参数传递(最通用)

把对象序列化为JSON字符串,作为查询参数拼到URL上,目标页面再解析还原。适合非敏感、可序列化的数据。

源页面代码修改:

import { useRouter } from 'next/navigation'  

const router = useRouter()
const data = { key: 'value', nested: { foo: 'bar' } }

// 序列化对象并转义特殊字符,避免URL解析异常
const encodedData = encodeURIComponent(JSON.stringify(data))
router.push(`/dashboard?data=${encodedData}`)

目标页面(/dashboard)获取数据:

如果是Client Component:

'use client'
import { useSearchParams } from 'next/navigation'

export default function Dashboard() {
  const searchParams = useSearchParams()
  const dataStr = searchParams.get('data')
  const data = dataStr ? JSON.parse(decodeURIComponent(dataStr)) : null

  return <div>传递的数据:{data?.key}</div>
}

如果是Server Component:

export default function Dashboard({ searchParams }) {
  const dataStr = searchParams.data
  const data = dataStr ? JSON.parse(decodeURIComponent(dataStr)) : null

  return <div>传递的数据:{data?.key}</div>
}

2. 通过React Context/状态管理传递(适合不暴露在URL的场景)

如果数据敏感或者不想出现在URL里,可以用React Context或Redux、Zustand这类状态管理工具,跳转前把数据存入状态,目标页面直接读取。

示例(基于React Context):

  1. 创建全局Context:
'use client'
import { createContext, useContext, useState } from 'react'

const AppContext = createContext()

export function AppProvider({ children }) {
  const [transferData, setTransferData] = useState(null)

  return (
    <AppContext.Provider value={{ transferData, setTransferData }}>
      {children}
    </AppContext.Provider>
  )
}

export function useAppContext() {
  return useContext(AppContext)
}
  1. 在根布局(app/layout.jsx)中包裹Provider:
import { AppProvider } from './app-context'

export default function RootLayout({ children }) {
  return (
    <html lang="zh-CN">
      <body>
        <AppProvider>{children}</AppProvider>
      </body>
    </html>
  )
}
  1. 源页面设置数据并跳转:
'use client'
import { useRouter } from 'next/navigation'
import { useAppContext } from './app-context'

const SourcePage = () => {
  const router = useRouter()
  const { setTransferData } = useAppContext()

  const handleNavigate = () => {
    const data = { key: '敏感数据' }
    setTransferData(data)
    router.push('/dashboard')
  }

  return <button onClick={handleNavigate}>前往控制台</button>
}

export default SourcePage
  1. 目标页面读取数据:
'use client'
import { useAppContext } from './app-context'

export default function Dashboard() {
  const { transferData } = useAppContext()

  return <div>敏感数据:{transferData?.key}</div>
}

注意:这种方式页面刷新后数据会丢失,仅适合纯客户端跳转且无需持久化的场景。

3. 通过Cookies传递(适合需要持久化的敏感数据)

如果数据需要跨页面刷新保留,且不想暴露在URL,可以用Cookies存储。

源页面设置Cookie并跳转:

'use client'
import { useRouter } from 'next/navigation'
import { setCookie } from 'cookies-next'

const router = useRouter()
const data = { key: '需要持久化的数据' }

// 设置Cookie,可配置过期时间、路径等参数
setCookie('transferData', JSON.stringify(data), { path: '/' })
router.push('/dashboard')

目标页面读取Cookie:

Client Component:

'use client'
import { getCookie } from 'cookies-next'

export default function Dashboard() {
  const dataStr = getCookie('transferData')
  const data = dataStr ? JSON.parse(dataStr) : null

  // 用完可删除Cookie避免残留
  // deleteCookie('transferData')

  return <div>持久化数据:{data?.key}</div>
}

Server Component:

import { cookies } from 'next/headers'

export default function Dashboard() {
  const cookieStore = cookies()
  const dataStr = cookieStore.get('transferData')?.value
  const data = dataStr ? JSON.parse(dataStr) : null

  return <div>持久化数据:{data?.key}</div>
}

内容的提问来源于stack exchange,提问作者Marcelo Henrique Fonseca

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 22:15:11