如何使用 Vue.js 预加载图像?

新手上路,请多包涵

我有一个使用 Vue.Js(带有 webpack)的小应用程序。我有一个过渡部分。当用户单击按钮时,内容将发生变化。这是一个简单的 DIV 元素,带有 IMG 子元素。我的问题是当用户单击按钮时,下一张图像将实时加载并且速度很慢,所以我需要以某种方式预加载这些图像。

我尝试了不同的方法,但无法实现预加载图像。问题:

  • 当页面显示时,只有第一张图片是 DOM 的一部分,因此不会加载其他图片。好的,这是正常行为。

  • 我无法通过对图像数组使用简单的 for 循环来预加载图像( 使用 JavaScript 预加载图像),因为图像将由唯一的查询字符串请求(1个 ) 到每个请求。因此预加载的图像名称将与请求的不匹配。

  • 我尝试使用 require() 加载图像并将其绑定到 IMG 标签的 src 属性。这也没有解决我的问题,当新的 DIV 将被插入到DOM中时,图像将在点击后实时加载。

我的简化单文件组件(.vue)看起来像这样:

 <template>
    <!-- [FIRST] -->
    <div v-if="contentId == 0">
      <transition
        enter-active-class="animated fadeIn"
        leave-active-class="animated fadeOut"
        mode="out-in">
        <img :src="images.firstScreenShot" key="firstImage">
      </transition>
    </div>
    <!-- [/FIRST] -->

    <!-- [SECOND] -->
    <div v-else-if="contentId == 1">
      <transition
        enter-active-class="animated fadeIn"
        leave-active-class="animated fadeOut"
        mode="out-in">

        <img :src="images.secondScreenShot" key="secondImage">
      </transition>
    </div>
    <!-- [/SECOND] -->
</template>
<script>
    export default {
        data() {
            return {
                contentId: 0,
                images: {
                    firstScreenShot: require('./assets/first-screen-shot.png'),
                    secondScreenShot: require('./assets/second-screen-shot.png'),
                }
            }
        }
    }
</script>

我是 Vue.js 的新手,也许我的方法不好。请让我知道什么是好的方法!

原文由 user6338195 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 412
1 个回答

我很快在浏览器中尝试了这个,但它似乎在控制台中工作。您可以使用 Javascript Image 对象来预加载看起来像的图像:

https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement/Image

您可以像这样创建一个新的 Image 对象:

 const image = new Image();

然后您可以为该图像分配一个 src 值:

 image.src = 'test.jpg'

当您立即向 src 属性提供数据时,浏览器将触发网络请求,这应该足以加载和缓存图像。这样您就不必将这些图像插入到 DOM 中。

如果我在这方面错了,请有人纠正我,但还没有尝试完全解决。

原文由 Stephan-v 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题