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

Next.js router.query返回undefined,动态传递artistName无法接收

Next.js动态路由参数获取undefined问题解决

我在CollectionItem.js组件中通过router.push动态传递artistName参数至app/artist/[artistId]/page.js组件,但在该页面组件中使用router.query解构获取artistName时返回undefined(参数已正常传递),希望在page.js中展示artistName。

相关代码

CollectionItem.js

import Image from "next/image";
import { useRouter } from "next/navigation";

const CollectionItem = ({
    additionalImages,
    collectionName,
    artistImage,
    artistName,
}) => {
    const router = useRouter();

    const handleNavigation = artistName => {
        router.push(`/artist/${artistName}`);
    };

    return (
        <div>
            {additionalImages.slice(0, 1).map((additionalImage, index) => (
                <Image
                    key={index}
                    src={additionalImage}
                    alt="additionalImage"
                    className="w-full md:w-[330px]"
                />
            ))}
            <div className="flex items-center justify-between gap-[15px] mt-[15px]">
                {additionalImages.slice(1, 3).map((additionalImage, index) => (
                    <Image
                        key={index}
                        src={additionalImage}
                        alt="additionalImage"
                        className="w-[95px] md:w-[100px]"
                    />
                ))}
                <div
                    onClick={() => handleNavigation(artistName)}
                    className="flex items-center justify-center bg-[#202020] px-[15px] py-[32px]  w-[95px] md:w-[100px] h-[95px] md:h-[100px] rounded-sm cursor-pointer"
                >
                    <h1 className="text-[22px] font-bold text-[#fff]">
                        {additionalImages.length - 2}+
                    </h1>
                </div>
            </div>
            <div className="text-[#fff] mt-[15px]">
                <h1 className="font-semibold text-[22px]">{collectionName}</h1>
                <div className="flex items-center gap-[12px] mt-[10px]">
                    <Image src={artistImage} alt="artistImage" />
                    <h1>{artistName}</h1>
                </div>
            </div>
        </div>
    );
};

export default CollectionItem;

page.js

"use client";
import { useRouter } from "next/navigation";

const ArtistPage = () => {
    const router = useRouter();
    const { artistName } = router.query;
    console.log(artistName);
    return <div className="text-[#ffffff]">Hello {}</div>;
};

export default ArtistPage;

解决方法

1. 修正路由参数名

你的动态路由文件命名为[artistId]/page.js,所以路由参数的键名是artistId,而非artistName。修改page.js中的解构逻辑:

"use client";
import { useRouter } from "next/navigation";

const ArtistPage = () => {
    const router = useRouter();
    const { artistId } = router.query;
    console.log(artistId);
    return <div className="text-[#ffffff]">Hello {artistId}</div>;
};

export default ArtistPage;

2. 处理路由参数加载延迟

在Next.js App Router的客户端组件中,router.query在组件初始挂载时可能为undefined,因为路由信息需要异步加载。可以通过以下两种方式解决:

方式一:条件渲染

"use client";
import { useRouter } from "next/navigation";

const ArtistPage = () => {
    const router = useRouter();
    const { artistId } = router.query;

    return <div className="text-[#ffffff]">Hello {artistId || "Loading..."}</div>;
};

export default ArtistPage;

方式二:useEffect监听路由变化

"use client";
import { useRouter } from "next/navigation";
import { useEffect, useState } from "react";

const ArtistPage = () => {
    const router = useRouter();
    const [artistName, setArtistName] = useState("");

    useEffect(() => {
        if (router.query?.artistId) {
            setArtistName(router.query.artistId);
        }
    }, [router.query]);

    return <div className="text-[#ffffff]">Hello {artistName}</div>;
};

export default ArtistPage;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 14:23:20