uni-app中和图片相关的组件在图片src动态变化时为什么会闪白,但html原生img标签不会,是有什么特别设置吗?

发布于 1周前 作者 ionicwang 来自 Uni-App

uni-app中和图片相关的组件在图片src动态变化时为什么会闪白,但html原生img标签不会,是有什么特别设置吗?

为什么uniapp的和图片相关的组件 在图片的src动态变化的时候(图片url是有一个时间戳参数防止缓存) 总是会闪白 但是用html原生的img标签就不会 请问是有什么特别的设置吗?

1 回复

在uni-app中,当图片组件的src属性动态变化时出现闪白现象,通常是由于图片在重新加载过程中,旧的图片资源被释放,新的图片资源还未加载完成,导致中间有一个空白期(即闪白现象)。相比之下,HTML原生<img>标签在某些情况下处理更为平滑,因为它可能利用了浏览器内置的缓存和预加载机制,减少了这种闪白现象。

在uni-app中,可以通过以下几种方式来减少或避免这种闪白现象:

  1. 使用占位图:在图片加载前显示一个占位图(如默认图片),加载完成后再显示实际图片。
<template>
  <view>
    <image :src="imageSrc" @load="onLoad" @error="onError" :style="{ opacity: loaded ? 1 : 0 }">
      <image src="placeholder.png" :style="{ opacity: loaded ? 0 : 1, position: 'absolute', top: 0, left: 0, width: '100%', height: '100%' }"></image>
    </image>
  </view>
</template>

<script>
export default {
  data() {
    return {
      imageSrc: 'initial_image_url',
      loaded: false
    };
  },
  methods: {
    onLoad() {
      this.loaded = true;
    },
    onError() {
      // Handle error
    },
    changeImage(newSrc) {
      this.loaded = false;
      this.imageSrc = newSrc;
    }
  }
};
</script>
  1. 使用v-if控制渲染:在图片地址变化时,先隐藏图片,加载完成后再显示。
<template>
  <view>
    <image v-if="loaded" :src="imageSrc" @load="onLoad" @error="onError"></image>
    <image v-else src="placeholder.png" style="width: 100%; height: 100%;"></image>
    <button @click="changeImage">Change Image</button>
  </view>
</template>

<script>
export default {
  data() {
    return {
      imageSrc: 'initial_image_url',
      loaded: true
    };
  },
  methods: {
    onLoad() {
      this.loaded = true;
    },
    onError() {
      // Handle error
    },
    changeImage() {
      this.loaded = false;
      setTimeout(() => {
        this.imageSrc = 'new_image_url';
      }, 0); // Allow Vue to update DOM before changing src
    }
  }
};
</script>
  1. 预加载图片:在需要动态改变图片前,先预加载这些图片到内存中,减少加载时间。

这些方法结合使用可以有效减少uni-app中图片src动态变化时的闪白现象。

回到顶部