实现Vue加载动画,同时从URL加载图片
P粉021854777
P粉021854777 2023-08-03 18:04:16
[Vue.js讨论组]
<p>我想在图片加载时显示加载动画,但我不知道如何实现。<br /><br />虽然没有加载器,但我进行了调试,控制台上显示了"true"和"false",但仍然没有加载动画出现。</p><p><br /></p> <pre class="brush:php;toolbar:false;">&lt;template&gt; &lt;div class="KingOfMountain"&gt; &lt;Spinner v-if="isLoading"/&gt; //// ERROR &lt;div v-else class="container"&gt; &lt;div v-if="!isEndGameKing" class="choices"&gt; &lt;p id="score"&gt;{{ currentCountKing }}/{{ ALL_FILMS.length - 1 }} &lt;p/&gt; &lt;div class="photos"&gt; &lt;div class="first__film"&gt; &lt;img :src="firstFilm.Poster" :alt="firstFilm.title" @click="chooseLeftFilm"&gt; &lt;p id="title--film"&gt;{{ firstFilm.title }}&lt;/p&gt; &lt;/div&gt; &lt;div class="second__film"&gt; &lt;img :src="secondFilm.Poster" :alt="secondFilm.title" @click="chooseRightFilm"&gt; &lt;p id="title--film"&gt;{{ secondFilm.title }}&lt;/p&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;div v-else class="winner"&gt; &lt;p id="winner--title"&gt;Победитель&lt;/p&gt; &lt;img :src="firstFilm.Poster" :alt="firstFilm.title"&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;/template&gt; &lt;script&gt; import game from "@/mixins/game"; import Spinner from "@/components/Spinner/Spinner"; //all good in css . it works export default { name: "KingOfMountain", data() { return{ isLoading:false } }, components: {Spinner}, methods: { chooseLeftFilm() { this.isLoading=true this.redirectToResultKing() // it is method in mixins (all Good, it works) this.isLoading=false }, chooseRightFilm() { this.isLoading=true this.firstFilm = this.secondFilm; this.redirectToResultKing() // it is method in mixins (all Good, it works) this.isLoading=false } }, } &lt;/script&gt;</pre> <p>如果我像这样使用,它会显示加载动画:</p> <pre class="brush:php;toolbar:false;">chooseLeftFilm() { this.isLoading=true this.redirectToResultKing() // it is method in mixins (all Good, it works) },</pre> <p>// it will spinner forever</p> <p>帮我,如何更好地制作加载动画?</p> <p>我的混入(mixins):</p> <pre class="brush:php;toolbar:false;">export default { methods: { updateFilm() { // Here i random take 2 images from Vuex and then them delete and etc... this.currentCountKing++; this.allFilmsKingCopy = this.allFilmsKingCopy.filter(val =&gt; val !== this.secondFilm) this.secondFilm = this.allFilmsKingCopy[Math.floor(Math.random() * this.allFilmsKingCopy.length)] }, redirectToResultKing() { if (this.currentCountKing === this.ALL_FILMS.length - 1) { this.isEndGameKing = true } else { this.updateFilm() } } }, computed: { ...mapGetters(['ALL_FILMS']), },</pre> <p>我的 Vuex:</p> <pre class="brush:php;toolbar:false;">export default { state: { films: [], }, actions: { async getFilms({commit}) { const data = await fetch(URL); const dataResponse = await data.json(); const films=dataResponse.data commit("setData", films) }, }, mutations: { setData(state, films) { state.films = films }, }, getters: { ALL_FILMS(state) { return state.films }, } }</pre> <p><br /></p>
P粉021854777
P粉021854777

全部回复(1)
P粉588660399

常见的方法是使用Image对象加载图片,然后使用load事件等待数据加载完成,在加载过程中显示加载动画。然后,您可以设置图片的URL,图片将立即更新:


const imgUrl = 'https://picsum.photos/200?random='
let imgCount = 0

const App = {
  template: `
    <div style="display: flex;">
      <div>
        <button @click="loadImage">Load new image</button>
      </div>
      <div v-if="isLoading">LOADING....</div>
      <img :src="src"/>
    </div>
  `,
  data() {
    return {
      isLoading: false,
      src: null,
    }
  },
  methods: {
    async loadImage() {
      this.src = null
      this.isLoading = true
      const img = new Image()
      img.src = imgUrl + imgCount++
      await new Promise(resolve => img.onload = resolve)
      this.src = img.src
      this.isLoading = false
    }
  },
  created() {
    this.loadImage()
  },
}
Vue.createApp(App).mount('#app')
<div id="app"></div>
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号