画像の切り替え - Vue.js

画像を動的に切り替えるには、imgタグのsrcにdataやcomputedをバインドする。

<template>
  <div>
    <img :src="imageSrc"> <!-- コロンを付ける -->
  </div>
</template>

<script>
  export default {
    name: 'Sample',
    data () {
      return {
        imageSrc: `/img/hoge.png`,
      }
    },
    methods: {
      // changeImg が呼ばれると画像を変更(この関数を呼ぶ処理は省略)
      changeImg () {
        this.imageSrc = `/img/piyo.png`
      },
    },
  }
</script>

ローディングアニメーションを表示する

大きな画像の場合、読み込むまでの少しの間、古い画像が表示され続ける。

少しのことだが紛らわしいので、くるくる回る例のアレを表示させたい。くるくるは自作してもいいし、vue-spinner などで見栄えのいいのが設置できる。(css3アニメーション必須)

その際、画像を動的に切り替えられるようにしていると、くるくるは何度でも読込と同時に表示させ、終了とともに消す必要がある。

また、(発生しないように作るのが一番いいが)通信エラーや意図しないURLなどで読込失敗した場合も、きちんと消す必要がある。

vue-spinnerではloading属性で表示非表示を切り替えられる。Vue.jsではimgタグにおいて、loadイベントとerrorイベントが発火するので、それを使う。本当は失敗時にはエラーメッセージとか表示させてもいいけど省略。

<template>
  <div>
    <img :src="imageSrc" @load="imageLoaded" @error="imageFailed">
    <pulse-loader :loading="isLoading">
  </div>
</template>

<script>
  import {PulseLoader} from 'vue-spinner/dist/vue-spinner.min'

  export default {
    name: 'Sample',
    data () {
      return {
        imageSrc: `/img/hoge.png`,
      }
    },
    methods: {
      changeImg () {
        this.isLoading = true
        this.imageSrc = `/img/piyo.png`
      },
      imgLoaded () {
        this.isLoading = false
      },
      imgFailed () {
        this.isLoading = false
      },
    },
    components: {PulseLoader},
  }
</script>

srcに直接リンクするのではなく、Ajaxで画像を取得して適当なDOM要素に描画するやり方って、簡単に出来るのかと思ったけど、意外と無い?

base64エンコードするやり方は見つかったけど、ちょっと重くなるしなあ。

画像は画像でブラウザにURL指定して取得させるのがベターなんだろうか。

programming/web_development/javascript/vuejs/tips/img.txt · 最終更新: 2018/12/12 by ikatakos
CC Attribution 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0