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

Vue如何实现用户点击后才加载banner组件的对应图片

可行实现方案

你遇到的原生懒加载失效是因为loading="lazy"仅基于元素是否处于视口范围判断加载时机,即便banner默认隐藏,只要DOM节点已渲染且位置在视口内,浏览器就会提前加载所有图片,不符合你点击才加载的需求。可以选择以下任意一种方案实现:

方案1:条件渲染+激活状态控制(最稳妥)

通过父组件维护已点击的banner状态,仅激活的banner才渲染真实图片节点,完全避免提前请求:

  1. 父组件新增激活状态与点击回调:
// 父组件响应式状态
const activatedBanners = ref(new Set())
const handleBannerTrigger = (bannerId) => {
  activatedBanners.value.add(bannerId)
  // 此处保留你原有的banner显示/隐藏切换逻辑
}
  1. 遍历组件时传递激活状态,绑定点击事件:
<banner-base
    v-for="banner in entry.banners"
    :key="banner.id"
    :slug-ficha="slugSelected"
    :promo-selected="promoSelected"
    :banner-id="banner.id"
    :is-activated="activatedBanners.has(banner.id)"
    @click.native="handleBannerTrigger(banner.id)"
/>
  1. banner-base内部通过v-if控制图片渲染,点击前可渲染本地占位图/空白占位块,不会触发远程资源请求:
<!-- banner-base 组件内部 -->
<div class="banner-container">
  <img v-if="isActivated" :src="你的banner图片地址" alt="banner">
  <div v-else class="banner-placeholder"></div>
</div>

方案2:动态赋值src属性

如果不希望切换DOM节点避免闪烁,可以将真实图片地址暂存在自定义属性中,点击后再赋值给src触发加载:

<!-- banner-base 组件内部 -->
<img 
  :data-real-src="你的banner图片地址"
  alt="banner"
  ref="bannerImgRef"
  @click="loadBannerImg"
>
// banner-base 内部逻辑
const bannerImgRef = ref(null)
const loadBannerImg = () => {
  if (bannerImgRef.value && !bannerImgRef.value.src) {
    bannerImgRef.value.src = bannerImgRef.value.dataset.realSrc
  }
  // 原有显示逻辑
}

方案3:手动控制懒加载实例

如果你项目中引入了VueUse等工具库,可以使用useImage方法手动控制图片加载时机,点击时再调用加载方法即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 02:54:05