gabakugik
@gabakugik (GABAKU GIK)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

詳細ページの実装したい

解決したいこと

Todo 詳細ページの実装を表示したい

発生している問題・エラー

Unhandled Runtime Error
TypeError: Cannot destructure property 'id' of 'router.query' as it is undefined.

Source
app/todos/[id]/page.tsx (18:11) @ id

  16 |   // ルーティング情報を取得する
  17 |   const router = useRouter();
> 18 |   const { id } = router.query;
     |           ^
  19 |
  20 |   // SWRを使ってデータを取得する
  21 |   const { data: todo, error } = useSWR<TodoType>(id ? `http://localhost:3000/todos/${id}` : null,

該当するソースコード

todos_controller.rb

class TodosController < ApplicationController
    
    def index
        # 日付が新しい順に10件まで取得する
        @todos = Todo.all.order(created_at: :desc).limit(10)
    
        render json: @todos
    
    end
    
    def show
        @todo = Todo.find(params[:id])

      render json: @todo
    end
   
   end
/frontend/app/app/todos/[id]/page.tsx
"use client";

import { useEffect, useState } from 'react';
import { useRouter } from 'next/navigation';
import useSWR from 'swr';
import Link from 'next/link';
import Todo from '@/components/Todo';
import { TodoType } from '@/types/Todo';
import axios from 'axios';

// Fetcher function for SWR
const fetcher = (url: string) => axios.get(url).then(res => res.data);

// Todo詳細ページを表示するコンポーネント
const TodoDetail = ({ params }: { params: { id: string } }) => {
  // ルーティング情報を取得する
  const router = useRouter();
  const { id } = params;

  // SWRを使ってデータを取得する
  const { data: todo, error } = useSWR<TodoType>(id ? `http://localhost:3000/todos/${id}` : null, fetcher);

  // エラーが発生した場合の処理
  if (error) return <div>Failed to load</div>;

  // Todoを取得中の場合は「Loading...」を表示する
  if (!todo) return <div>Loading...</div>;

  return (
    <div className="flex justify-center items-center">
      <div className="flex flex-col space-y-6 w-3/4 max-w-lg pt-10">
        <label className="block text-xl font-bold text-gray-700">Todo</label>
        <Todo todo={todo} />
        <div className="flex justify-end">
          <Link
            href="/"
            className="mt-auto font-medium text-blue-600 hover:bg-blue-300 focus:outline-none"
          >
            Back
          </Link>
        </div>
      </div>
    </div>
  );
};

export default TodoDetail;

自分で試したこと

import { useRouter } from 'next/navigation';
に変えた。
後ここのデータが欲しいとかあれば記載するんでよろしくお願いします。

1

1Answer

const TodoDetail = ({ params }: { params: { id: string } }) => {
// ルーティング情報を取得する
const router = useRouter();
const { id } = params;
でいけました。

1Like

Your answer might help someone💌