인프런 커뮤니티 질문&답변

김관김관님의 프로필 이미지
김관김관

작성한 질문수

따라하며 배우는 노드, 리액트 시리즈 - 영화 사이트 만들기

무비앱 시리즈 #5 Grid Card Component ( 따라하며 배우는 리액트 노드 )

선생님... Movies가 불러지지가 않습니다 ㅠㅠ 어케된걸까요

작성

·

285

0

import React,{useEffectuseStatefrom 'react'
import { FaCode } from "react-icons/fa";
import {API_URLIMAGE_BASE_URLAPI_KEYfrom '../../Config';
import MainImage from './Sections/MainImage'
import GridCards from '../common/GridCards'
import {Rowfrom 'antd';

function LandingPage() {
    
    const [MoviessetMovies] = useState([]);
    const [MainMovieImagesetMainMovieImage] = useState(null); 
    
    function hookFunction(MoviesMainMovieImage){
        setMainMovieImage(MainMovieImage)
        // setMainMovieImage(response.results[0])
        setMovies([Movies.results])
        console.log(`Movies->   ${Movies}``MainMovieImage->  ${MainMovieImage}`);
    }

    function MoviesCall(){
        Movies.map((movieindex=> {
            console.log(index);
        })
    }

    useEffect(() => {
        const endpoint = `${API_URL}movie/popular?api_key=${API_KEY}&language=en-US&page=1`;
        fetch(endpoint)
        .then(response => response.json())
        .then(response =>{
            hookFunction(response.resultsresponse.results[0])
        }
        )
        return () => {
            console.log("I'm dying...");
        }
    }, [])
    

    return (
        <>
        <div style={{width:'100%'margin:'0'}}>
        
         {/* path오류는 값을 가져오기전 랜더링해버려서 그럼 */}
         {/* MainImage */}
        {MainMovieImage &&
        <MainImage image={`${IMAGE_BASE_URL}w1280${MainMovieImage.backdrop_path}`}
                    title ={MainMovieImage.original_title}
                    text = {MainMovieImage.overview}
                    />
        }
        <div style={{width:'100%'margin:'1rem auto'}}>
            <h2>Movies by latest</h2>
            <hr/>
            {/* GridImage */}
             <Row>
                {Movies && Movies.map(function(movieindex){
                    console.log(`movie->>>${movie}`);
                })} 
            </Row>
            </div>
            <div style={display:'flex'justifyContent:'center' }}>
                <button>
                    Load More
                </button>
            </div>
        </div>
        </>
    )
}

export default LandingPage
useEffect부분에서 호출해서 Movies값이 출력되는 것을
확인했는데요 렌더링부분에서 undefined가뜹니다.
useEffect가didMount뒤에 부른다면 딱히
값이 없어질 타이밍이 없는거같은데 어떻게된걸까요??

답변 4

3

저도 위에분과 같은 증상이네요.

useEffect(() => {
        const endpoint = `${API_URL}movie/popular?api_key=${API_KEY}&language=en-US&page=1`
        
        fetch(endpoint)
            .then(res => res.json())
            .then(res => {
                console.log(res);
                setMovies([res.results]) → setMovies(res.results) 로 수정하면 강의대로 진행됩니다.
                setMainMovieImage(res.results[0])
            })
   }, [])

저같은 경우에, 문제 확인 차 여러가지 해본결과   

setMovies([res.results])   로 했을 경우에

{Movies && Movies.map((movieindex=> (
                    <React.Fragment key={index}>
                        <GridCards
                            image={movie.poster_path ?
                                `${IMAGE_BASE}w500${movie.poster_path}` : null }
                            movieId = {movie.id}
                             movieName={movie.original_title}
                        />
                    </React.Fragment>
                ))}

movie에는 Object가 들어있어서, Object안 스탭에 접근을 못해서,  undefined가 된것 같습니다.

{Movies && Movies.map((movieindex=> (
                    <React.Fragment key={index}>
                        <GridCards
                            image={movie[0].poster_path ?
                                `${IMAGE_BASE}w500${movie[0].poster_path}` : null }
                            movieId = {movie[0].id}
                             movieName={movie[0].original_title}
                        />
                    </React.Fragment>
                ))}

위와 같이 movie[0]처럼, index값을 지정해주면, 해당 index정보만 출력이 잘됩니다.

1

김관김관님의 프로필 이미지
김관김관
질문자

ㅠㅠㅠ 선생님의 말씀에 힘입어 해결하였습니다.

에러 원인이 두가지 있었습니다.

그런데 선생님 코드에서는 setMovies에서[response.result]로 넣어주셨는데 이중배열이 아니라 그냥 배열로 사용되었는데

어떻게된걸까용??

    function hookFunction(Movies, MainMovieImage){//response.result를 받고 다시 Movies.result호출 <-에러 1
        setMovies([Movies.result])//[Movies]를 넣어주면 이중배열 setMovies(Movies)코드로 수정후 해결 <-에러 2
        setMainMovieImage(MainMovieImage)
        // setMainMovieImage(response.results[0])
        console.log(`Movies->   ${Movies}``MainMovieImage->  ${MainMovieImage}`);
   }

1

김관김관님의 프로필 이미지
김관김관
질문자

console.log(`movie->>>${movie}``Movies=>>>>${Movies}`);
결과값 movie->>>undefined Movies=>>>>
console.log(`movie->>>${movie}``Movies=>>>>${Movies != null}`);
결과값 movie->>>undefined Movies=>>>>true
console.log(`movie->>>${movie}``Movies=>>>>${Movies != undefined}`);
결과값 movie->>>undefined Movies=>>>>true
Movies값 자체가 undefined가 나옵니다.
Movies값이 비어있다고생각했는데 undefined였던것같습니다.
첫번째 consol.log에서Movies값이 비어있어서 착각했었네요.

0

John Ahn님의 프로필 이미지
John Ahn
지식공유자

 <Row>

                {Movies && Movies.map(function(movie, index){

                    console.log(`movie->>>${movie}`);

                })} 

            </Row>

여기서  movie 값이 undefined인가요 ?  아니면  Movies 자체가 undefined가 나오나요 ~ ?

김관김관님의 프로필 이미지
김관김관

작성한 질문수

질문하기