Невозможно деструктурировать свойство "id" "router.query", поскольку оно не определено

// data.js
export const data = {
    orders: [
        {
            id: 1,
            customer: "Customer A",
            items: [
                { id: 1, name: "Item 1", quantity: 5 },
                { id: 2, name: "Item 2", quantity: 3 }
            ],
            status: "Pending"
        },
        {
            id: 2,
            customer: "Customer B",
            items: [
                { id: 1, name: "Item 1", quantity: 2 },
                { id: 3, name: "Item 3", quantity: 1 }
            ],
            status: "Completed"
        }
    ],
    items: [
        { id: 1, name: "Item 1", stock: 20 },
        { id: 2, name: "Item 2", stock: 15 },
        { id: 3, name: "Item 3", stock: 10 }
    ]
};
//[id]\page.js
"use client";

import { useRouter } from "next/navigation";
import { data } from "../../../utils/data";

const OrderDetails = () => {
    const router = useRouter();
    const { id } = router.query;

    if (!id) {
        return <div>No order ID provided</div>;
    }

    const order = data.orders.find(order => order.id === parseInt(id));

    if (!order) {
        return <div>Order not found</div>;
    }

    return (
        <div className = "container mx-auto p-4">
            <h1 className = "text-2xl font-bold mb-4">Order Details - {order.id}</h1>

            <p>Customer: {order.customer}</p>
            <p>Status: {order.status}</p>
            <h2 className = "text-xl font-semibold ">Items: </h2>
            <ul>
                {
                    order.items.map(item => (
                        <li key = {item.id} className = "border-b py-2">
                            <p>Name: {item.name}</p>
                            <p>Quantity: {item.quantity}</p>
                            <p>Stock: {data.items.find(i => i.id === item.id).stock}</p>
                        </li>
                    ))
                }
            </ul>
            <button className = "mt-4 bg-green-500 text-white px-4 py-2 rounded">Mark as Completed</button>
        </div>
    );
};

export default OrderDetails;
//orders\page.js
"use client";

import { useEffect, useState } from "react";
import { data } from "../../utils/data";
import Link from 'next/link';

const OrderList = () => {
    const [orders, setOrders] = useState(data.orders);
    const [filter, setFilter] = useState('');

    useEffect(() => {
        if (filter) {
            setOrders(data.orders.filter(order => order.status === filter));
        } else {
            setOrders(data.orders);
        }
    }, [filter]);

    return (
        <div className = "container mx-auto p-4">
            <h1 className = "text-2xl font-bold mb-4">Orders List</h1>
            <div className = "mb-4">
                <label htmlFor = "statusFilter" className = "mr-2">Filter by status:</label>
                <select
                    id = "statusFilter"
                    onChange = {e => setFilter(e.target.value)}
                    className = "border rounded px-2 py-1 bg-black"
                >
                    <option value = "">All</option>
                    <option value = "Pending">Pending</option>
                    <option value = "Completed">Completed</option>
                </select>
            </div>
            <ul>
                {orders.map(order => (
                    <li key = {order.id} className = "border-b py-2">
                        <div className = "flex justify-between">
                            <div>
                                <h2 className = "text-xl font-semibold">Order ID: {order.id}</h2>
                                <p>Customer: {order.customer}</p>
                                <p>Status: {order.status}</p>
                                <p>Item Count: {order.items.length}</p>
                            </div>
                            <Link href = {`/orders/` + orders.id}>
                                <button className = "text-blue-500">View Details</button>
                            </Link>
                        </div>
                    </li>
                ))}
            </ul>
        </div>
    );
};

export default OrderList;
//inventory\page.js
"use client";

import { useState } from "react";
import { data } from "../../utils/data";

const InventoryList = () => {
    const [items, setItems] = useState(data.items);

    const handleDelete = (id) => {
        setItems(items.filter(item => item.id !== id));
    };

    return (
        <div className = "container mx-auto p-4">
            <h1 className = "text-2xl font-bold mb-4">Inventory List</h1>
            <ul>
                {items.map(item => (
                    <li key = {item.id} className = "border-b py-2 flex justify-between">
                        <div>
                            <p>Name: {item.name}</p>
                            <p>Stock: {item.stock}</p>
                        </div>
                        <button
                            onClick = {() => handleDelete(item.id)}
                            className = "text-red-500"
                        >
                            Delete
                        </button>
                    </li>
                ))}
            </ul>
        </div>
    );
};

export default InventoryList;

Ошибка, которую я получаю:
скриншот ошибки

ожидаю увидеть подробности заказа на /orders/[id]

Ошибка, по-видимому, связана с тем, что объект router.query не определен, что приводит к возникновению ошибки TypeError при попытке деструктурировать из него свойство id.

Я попытался проверить значение router.query и убедиться, что в URL-адресе указаны необходимые параметры запроса, но ошибка не устранена.

Я не уверен, почему router.query в этом случае не определен, особенно если учесть, что этот компонент является частью приложения Next.js, где маршрутизация должна обрабатываться автоматически.

Мы будем очень признательны за любые идеи или предложения по устранению и устранению этой проблемы.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
72
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема с вашим кодом в том, что вы не используете правильный хук.

В более новых версиях NextJS запрос больше не существует для объекта маршрутизатора, вместо этого у вас есть возврат, пересылка, предварительная выборка, отправка, обновление и замена. Вы можете консольно логировать роутер и убедиться в этом сами.

Решение состоит в том, чтобы использовать хук useParams из следующей навигации, см. пример ниже.

import { useParams } from "next/navigation";

const params = useParams();
console.info(params.id);

Другие вопросы по теме