-
Vue 프로젝트 Vue 플러그인 (이미지 로드 이벤트)프로젝트/영화 검색 (Vue) 2021. 8. 17. 01:42
예제
Vue 프로젝트 Vue 플러그인 (이미지 로드 이벤트)
1. /src/plugins 생성, /src/plugins/loadImage.js 생성
export default { install(app) { app.config.globalProperties.$loadImage = src => { return new Promise(resolve => { const img = document.createElement('img') img.src = src img.addEventListener('load', () => { // 완료! resolve() }) }) } } }
2. /src/main.js 수정
- loadImage.js 플러그인 등록
import { createApp } from 'vue' import App from './App.vue' /* index.js 생략 가능 */ import router from './routes' import store from './store' import loadImage from './plugins/loadImage' /* .use() 특정한 플러그인 연결 */ createApp(App) .use(router) // $route, $router .use(store) // $store .use(loadImage) // $loadImage .mount('#app')
3. /src/components/MovieItem.vue 수정
- data() 추가
- methods 추가
- Loader 컴포넌트 가져오기
- 템플릿 Loader 삽입
- mounted() 추가
<template> <div :style="{ backgroundImage: `url(${movie.Poster})` }" class="movie"> <Loader v-if="imageLoading" :size="1.5" absolute /> ...
<script> import Loader from '~/components/Loader' export default { components: { Loader }, props: { ... }, data() { return { imageLoading: true } }, mounted() { this.init() }, methods: { async init() { await this.$loadImage(this.movie.Poster) this.imageLoading = false } } } </script> ...
4. /src/routes/Movie.vue 수정 (Movie 카테고리 포스터 이미지 로드 이벤트 추가)
- data() 추가
- requestDiffSizeImage() 수정
- position 값 추가
... <div :style="{ backgroundImage: `url(${requestDiffSizeImage(theMovie.Poster)})` }" class="poster"> <Loader v-if="imageLoading" absolute /> </div> ...
... data() { return { imageLoading: true } }, ... methods: { requestDiffSizeImage(url, size = 700) { const src = url.replace('SX300', `SX${size}`) this.$loadImage(src) .then(() => { this.imageLoading = false }) return src } } ...
... .poster { ... position: relative; } ...
결과
참고
https://v3.vuejs.org/guide/plugins.html#writing-a-plugin
Plugins | Vue.js
Plugins Plugins are self-contained code that usually add global-level functionality to Vue. It is either an object that exposes an install() method, or a function. There is no strictly defined scope for a plugin, but common scenarios where plugins are usef
v3.vuejs.org
'프로젝트 > 영화 검색 (Vue)' 카테고리의 다른 글
Vue 프로젝트 Nav 경로 일치 및 활성화 (0) 2021.08.19 Vue 프로젝트 영화 포스터가 없는 경우 예외 처리 (0) 2021.08.17 Vue 프로젝트 더 높은 해상도의 영화 포스터 가져오기 (0) 2021.08.16 Vue 프로젝트 Ratings 데이터 출력 (0) 2021.08.16 Vue 프로젝트 영화 상세 페이지 정리 (0) 2021.08.09