image.png

버튼 안에 버튼을 넣으니 console에 오류가 발생했다. 오류가 발생한 코드는 다음과 같다.

import DetailBoard from "./DetailBoard.jsx";
import {useNavigate} from "react-router-dom";

function PokemonCard({ pokemon }) {
    // id를 000으로 바꿔줌
    const id = String(pokemon.id).padStart(3, '0');
    const navigate = useNavigate();

    function onClickHandle() {

        navigate(`/detail/${pokemon.id}`);
    }
    
    return (
        <div>
            <button onClick={onClickHandle}>
                <img src={pokemon.img_url} alt={pokemon.korean_name}></img>
                <h3>{pokemon.korean_name}</h3>
                <p>No. {id}</p>
                <button>추가</button>
            </button>
        </div>
    )
}

export default PokemonCard;

button 태그 안에 button을 넣었다.

찾아보니 HTML에서는 <button> 안에 다른 <button>을 금지한다고 한다. React hydration 오류를 일으킨다고 한다.

React Hydration

내부 button을 span으로 고치니 오류는 해결되었다.


image.png

detail 페이지에 포켓몬 데이터를 전달했는데 오류가 뜬다.

function DetailBoard({ pokemon }) {
    
    console.log(pokemon)

    return (
        <div>
            <img src={pokemon.img_url} alt={pokemon.korean_name}></img>
            <h3>{pokemon.korean_name}</h3>
            <p>{pokemon.types}</p>
            <p>{pokemon.description}</p>
            <button>뒤로 가기</button>
        </div>
    )
}

export default DetailBoard;

console로 pokemon을 찍으면 데이터가 나오는데 return 문에서 pokemon 데이터를 받지 못한다. 정확히는 undefined로 찍힌다.

원인을 찾아보니 React 컴포넌트는 여러 번 렌더링되기 때문에, 처음 렌더링 때는 undefined였고, 나중에 props가 채워졌을 수 있다.

그래서 if 문으로 pokemon 데이터가 없을 때는 로딩 중이라고 설정했는데 값이 계속 불러오지 않았다.

아마 부모 컴포넌트에서 문제가 있다고 판단하고 부모 컴포넌트를 봤다.