我想在IMG加载时获得加载器旋转器,但我不知道这是如何实现的.

没有加载器,但我go 了标签,对错都写到了控制台上,但还是没有旋转器

<template>
    <div class="KingOfMountain">
        <Spinner v-if="isLoading"/> //// ERROR
        <div v-else class="container">
            <div v-if="!isEndGameKing" class="choices">
                <p id="score">{{ currentCountKing }}/{{ ALL_FILMS.length - 1 }}
                <p/>
                <div class="photos">
                    <div class="first__film">
                        <img :src="firstFilm.Poster" :alt="firstFilm.title" @click="chooseLeftFilm">
                        <p id="title--film">{{ firstFilm.title }}</p>
                    </div>
                    <div class="second__film">
                        <img :src="secondFilm.Poster" :alt="secondFilm.title" @click="chooseRightFilm">
                        <p id="title--film">{{ secondFilm.title }}</p>
                    </div>
                </div>
            </div>
            <div v-else class="winner">
                <p id="winner--title">Победитель</p>
                <img :src="firstFilm.Poster" :alt="firstFilm.title">
            </div>
        </div>
    </div>
</template>

<script>
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
        }
    },
}
</script>

如果我这样使用,它就会旋转,

chooseLeftFilm() {
    this.isLoading=true
    this.redirectToResultKing() // it is method in mixins (all Good, it works)
},

//它将永远旋转

请帮帮我.怎样才能做得更好呢?

我的Mixins:

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 => 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']),
},

我的Vuex:

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
        },
    }
}

推荐答案

常见的方法是在Image object中加载图像,然后使用load event等待,直到数据加载完毕,并在两者之间显示一个微调框.然后你可以设置图片url,img会立即更新:

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>


您可以省略Image对象并在img上使用@load事件,但这会短暂地同时显示微调器和图像,除非您使用v-show隐藏图像:

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
        v-show="!isLoading"
        :src="src"
        @load="isLoading = false"
      />
    </div>
  `,
  data() {
    return {
      isLoading: false,
      src: null,
    }
  },
  methods: {
    async loadImage() {
      this.isLoading = true
      this.src = imgUrl + imgCount++
    }
  },
  created() {
    this.loadImage()
  },
}
Vue.createApp(App).mount('#app')
<div id="app"></div>
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>

Javascript相关问答推荐

Vega中的模运算符

单击更新页面的按钮后,页面刷新;测试/断言超时,有两个标题,但没有一个标题

判断表格单元格中是否存在文本框

将2D数组转换为图形

Angular:动画不启动

Angular 17—每当一个布尔变量变为真时触发循环轮询,只要它保持为真

为什么当我解析一个promise时,输出处于挂起状态?

jQuery s data()[storage object]在vanilla JavaScript中?'

为什么!逗号和空格不会作为输出返回,如果它在参数上?

html + java script!需要帮助来了解为什么我得到(无效的用户名或密码)

用JS从平面文件构建树形 struct 的JSON

400 bad request error posting through node-fetch

为什么可选参数的顺序会导致问题?

传递方法VS泛型对象VS事件特定对象

使用jQuery find()获取元素的属性

如何找到带有特定文本和测试ID的div?

Jexl to LowerCase()和Replace()

JavaScript -复制到剪贴板在Windows计算机上无效

MongoDB通过数字或字符串过滤列表

使用createBrowserRoutVS BrowserRouter的Reaction路由