프로젝트/영화 검색 (Vue)

Vue 프로젝트 Vue 플러그인 (이미지 로드 이벤트)

IT Blue 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