You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue.js图片加载状态切换光标异常求助:进度/指针光标不生效

问题分析与解决方案

咱们一步步拆解你遇到的问题,逐个解决:

1. CSS关键字未加引号,导致样式判断失效

你样式绑定里的pointer和progress是CSS内置的关键字,必须以字符串形式传入,但你现在直接写了变量名,Vue会尝试在实例中查找这两个变量,找不到就会返回undefined,导致整个cursor样式不生效。而<v-card>的link属性会默认给卡片加上cursor: pointer的样式,所以你看到光标一直是pointer。

修正这个部分:

:style="{ cursor: imageLoaded[index] ? 'pointer' : 'progress' }"

2. imageLoaded数组未初始化,初始状态异常

你初始化imageLoaded为空数组,循环渲染options时,imageLoaded[index]的初始值是undefined,虽然逻辑上undefined会被当作false,但为了避免潜在的逻辑错误,最好在组件初始化时就把imageLoaded设置为和options长度一致的数组,每个元素默认false。

在created钩子中添加初始化代码:

created() {
  this.imageLoaded = this.options.map(() => false);
}

3. 可选:处理v-card的link属性优先级问题

如果修正前两点后还是有问题,大概率是v-card的link属性自带的cursor: pointer样式优先级比你绑定的内联样式高。你可以二选一:

  • 去掉v-card的link属性(你已经通过@click添加了点击事件,link主要是提供默认链接视觉效果,若不需要可直接移除)
  • 给绑定的cursor样式加上!important强制覆盖:
    :style="{ cursor: imageLoaded[index] ? 'pointer' : 'progress !important' }"
    

修正后的完整代码片段

<v-row>
  <v-col v-for="(option, index ) in options" :key="index" cols="6">
    <v-lazy :options="{ threshold: 0.5 }" min-height="130">
      <v-hover v-slot:default="{ hover }">
        <v-card 
          width="160" 
          id="options_card" 
          :class="[option.selected ? 'elevation-8 primary' : 'elevation-2']" 
          @click="OptionSelected( index, option )" 
          :style="{ cursor: imageLoaded[index] ? 'pointer' : 'progress' }"
        >
          <v-list-item>
            <v-list-item-content>
              <span id="option_title">{{ option.title }}</span>
            </v-list-item-content>
          </v-list-item>
          <v-img 
            width="100%" 
            height="130" 
            :src="option.thumbnail" 
            id="thumbnail" 
            @load="imageLoaded[index]=true"
          >
            <template v-slot:placeholder>
              <v-sheet color="grey lighten-4" class="px-3 pt-3 pb-6 fill-height">
                <v-skeleton-loader type="image"></v-skeleton-loader>
              </v-sheet>
            </template>
          </v-img>
        </v-card>
      </v-hover>
    </v-lazy>
  </v-col>
</v-row>
data () {
  return {
    imageLoaded: []
  }
},
created() {
  this.imageLoaded = this.options.map(() => false);
}

这样就能实现你想要的效果:图片加载完成前光标显示为progress,加载完成后切换为pointer了。

内容的提问来源于stack exchange,提问作者Boidurja Talukdar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 10:57:57