inblog logo
|
vosw1
    Script

    Vue.js 영화 App) movies 컴퍼넌트로 만들기

    송민경's avatar
    송민경
    Sep 11, 2024
    Vue.js 영화 App) movies 컴퍼넌트로 만들기

    1. Movies.vue 만들기

    notion image

    2. 영화 정보 가져오기

    <template> <div <h1>영화 정보</h1> <div v-for="(movie, i) in movies" :key="i" class="item"> <figure> <img :src="movie.imgUrl" :alt="movie.title"> </figure> <div class="info"> <h3 class="bg-yellow">{{ movie.title }}</h3> <p>개봉: {{ movie.year }}</p> <p>장르: {{ movie.category }}</p> <p>상영시간: {{ movie.time }}</p> <p>등급: {{ movie.rating }}</p> <button v-on:click="incrementLike(i)">좋아요</button> <span>{{ movie.like }}</span> <p> <button @click="selectMovie(i)">상세보기</button> </p> </div> </div> </div> </template>
     

    3. 컴포넌트로 등록하기

    <script> export default { name: "MoviesComponent" } </script>
     

    4. App.vue에서 컴포넌트 불러오기

    <template> <div> <Navbar /> <Movies :movies="movies" /> <!-- 자식에게 변수 값 전달하기 --> <Modal :movies="movies" :isModal="isModal" :selectedMovie="selectedMovie" @closeModal="isModal=false" /> </div> </template> <script> import movies from './assets/movies'; import Navbar from './components/Navbar.vue'; import Modal from './components/Modal.vue'; import Movies from './components/Movies.vue'; export default { name: 'App', data() { return { isModal: false, selectedMovie: null, movies: movies } }, methods: { incrementLike(i) { this.movies[i].like++; }, selectMovie(i) { this.selectedMovie = i; this.isModal = true; }, }, components: { Navbar: Navbar, Modal: Modal, Movies: Movies, } } </script>
    notion image
     

    4. 영화 데이터를 자식에게 전달하기

    <template> <div> <Navbar /> <Movies :movies="movies" /> <!-- 자식에게 변수 값 전달하기 --> <Modal :movies="movies" :isModal="isModal" :selectedMovie="selectedMovie" @closeModal="isModal=false" /> </div> </template
     

    5. 부모 데이터 받기

    • 전체는 컨테이너로 감싸서 디자인 정리하기
    <template> <div class="Container"> <h1>영화 정보</h1> <div v-for="(movie, i) in movies" :key="i" class="item"> <figure> <img :src="movie.imgUrl" :alt="movie.title"> </figure> <div class="info"> <h3 class="bg-yellow">{{ movie.title }}</h3> <p>개봉: {{ movie.year }}</p> <p>장르: {{ movie.category }}</p> <p>상영시간: {{ movie.time }}</p> <p>등급: {{ movie.rating }}</p> <button v-on:click="incrementLike(i)">좋아요</button> <span>{{ movie.like }}</span> <p> <button @click="selectMovie(i)">상세보기</button> </p> </div> </div> </div> </template> <script> export default { name: "MoviesComponent", props: { movies: Array } } </script> <style> </style>
    • CSS 적용하기
    <style> .container { padding: 20px; } </style>
     

    6. 상태값 변경 요청하기

    • 상세보기를 열 수 있는 클릭 이벤트, 보여줄 영화정보의 인덱스가 필요함
    • 부모에게 커스텀 이벤트 요청
    • $emit(이름, 값)
    <template> <div class="Container"> <h1>영화 정보</h1> <div v-for="(movie, i) in movies" :key="i" class="item"> <figure> <img :src="movie.imgUrl" :alt="movie.title"> </figure> <div class="info"> <h3 class="bg-yellow">{{ movie.title }}</h3> <p>개봉: {{ movie.year }}</p> <p>장르: {{ movie.category }}</p> <p>상영시간: {{ movie.time }}</p> <p>등급: {{ movie.rating }}</p> <button v-on:click="incrementLike(i)">좋아요</button> <span>{{ movie.like }}</span> <p> <button @click="$emit('openModal', i)">상세보기</button> </p> </div> </div> </div> </template>
    notion image
    • 상태값 변경해주기
    <template> <div> <Navbar /> <Movies :movies="movies" @openModal="isModal=true; selectedMovie=$event" /> <!-- 자식에게 변수 값 전달하기 --> <Modal :movies="movies" :isModal="isModal" :selectedMovie="selectedMovie" @closeModal="isModal=false" /> </div> </template>
    notion image
     

    7. 좋아요 버튼 상태 변경해주기

    <template> <div class="Container"> <h1>영화 정보</h1> <div v-for="(movie, i) in movies" :key="i" class="item"> <figure> <img :src="movie.imgUrl" :alt="movie.title"> </figure> <div class="info"> <h3 class="bg-yellow">{{ movie.title }}</h3> <p>개봉: {{ movie.year }}</p> <p>장르: {{ movie.category }}</p> <p>상영시간: {{ movie.time }}</p> <p>등급: {{ movie.rating }}</p> <button v-on:click="$emit('incrementLike', i)">좋아요</button> <span>{{ movie.like }}</span> <p> <button @click="$emit('openModal', i)">상세보기</button> </p> </div> </div> </div> </template>
    • 상태 값 변경해주기
    <template> <div> <Navbar /> <Movies :movies="movies" @openModal="isModal=true; selectedMovie=$even" @incrementLike="incrementLike($event)" /> <!-- 자식에게 변수 값 전달하기 --> <Modal :movies="movies" :isModal="isModal" :selectedMovie="selectedMovie" @closeModal="isModal=false" /> </div> </template>
    notion image
    Share article

    vosw1

    RSS·Powered by Inblog