Skip to content

Img 图片

8:14

组件概况

Img 图片组件是一个增强版的图片展示组件,基于 uni-app 原生 image 组件封装。除了基础的图片渲染能力外,还提供了加载状态管理、错误处理、图片预览、圆角/圆形裁剪、懒加载以及自定义占位插槽等丰富功能,适用于各种图片展示场景。

组件内部维护了图片的加载状态(loading、error、success),并根据状态自动切换显示内容,为开发者提供了完整的图片加载生命周期控制能力。

核心功能描述

  • 图片加载状态管理:自动追踪图片加载过程,提供 loading、error、success 三种状态
  • 自定义插槽:支持 loadingerror 两个具名插槽,允许自定义加载中和加载失败时的显示内容
  • 图片预览:内置图片预览功能,点击即可调用 uni-app 原生图片预览能力
  • 尺寸控制:支持设置宽度、高度,默认单位为 px,也支持其他 CSS 单位
  • 填充模式:支持 uni-app image 组件的所有 mode 值,控制图片裁剪和缩放行为
  • 圆角与圆形:通过 radius 属性设置圆角大小,或通过 round 属性快速显示为圆形
  • 懒加载:通过 lazy-load 属性启用图片懒加载,优化页面性能
  • 自定义样式:支持自定义根节点样式和样式类,满足个性化定制需求

适用业务场景

  • 商品列表:电商场景中展示商品缩略图,支持点击预览大图
  • 用户头像:使用圆形头像展示,配合加载失败时的默认占位图
  • 图文内容:文章、帖子中的图片展示,支持懒加载优化首屏性能
  • 图片墙/相册:批量图片展示,结合不同填充模式实现多样化布局
  • 加载优化:网络图片加载时显示加载动画,提升用户体验

API

Props

属性名说明类型可选值默认值最低版本
src图片链接string---
previewSrc预览图片链接,点击预览时使用该地址string---
round是否显示为圆形boolean-false-
mode图片裁剪和缩放模式stringscaleToFill / aspectFit / aspectFill / widthFix / heightFix / top / bottom / center / left / right / top left / top right / bottom left / bottom rightscaleToFill-
lazyLoad是否开启图片懒加载boolean-false-
width图片宽度,默认单位为 px,支持带单位的字符串或纯数字number / string---
height图片高度,默认单位为 px,支持带单位的字符串或纯数字number / string---
radius图片圆角大小,默认单位为 px,支持带单位的字符串或纯数字number / string---
enablePreview是否允许点击预览图片,仅在图片加载成功后点击生效boolean-false-
showMenuByLongpress是否开启长按图片显示识别小程序码菜单,仅在微信小程序平台有效boolean-false-
customStyle自定义根节点样式string-''-
customClass自定义根节点样式类string-''-
customImage自定义 image 元素样式类string-''-

Slots

插槽名说明子节点内容
loading图片加载中的自定义内容,在 statusloading 时显示任意内容
error图片加载失败的自定义内容,在 statuserror 时显示任意内容

Methods

组件未暴露外部可调用的方法。

Events

事件名说明回调参数
click点击图片时触发,无论图片是否加载成功都会触发event: MouseEvent
load图片加载成功时触发event: Event
error图片加载失败时触发event: Event

使用示例

基础用法

最基本的图片展示方式,通过 src 属性指定图片链接,通过 widthheight 控制图片尺寸。

vue
<template>
  <wd-img :width="100" :height="100" :src="imageUrl" />
</template>

<script lang="ts" setup>
import { ref } from 'vue'

const imageUrl = ref('https://example.com/image.jpg')
</script>

自定义加载状态插槽

通过 loadingerror 两个具名插槽,自定义图片加载过程中的显示内容。

vue
<template>
  <wd-img :width="100" :height="100" src="https://example.com/image.jpg">
    <template #loading>
      <view class="loading-wrap">
        <wd-loading />
      </view>
    </template>
    <template #error>
      <view class="error-wrap">加载失败</view>
    </template>
  </wd-img>
</template>

<style scoped>
.loading-wrap {
  width: 100%;
  height: 100%;
  display: flex;
  justify-content: center;
  align-items: center;
}

.error-wrap {
  width: 100%;
  height: 100%;
  background-color: rgb(122, 117, 117);
  color: white;
  line-height: 100px;
  text-align: center;
}
</style>

填充模式

通过 mode 属性设置图片的裁剪和缩放模式,适用于不同比例的图片展示场景。

vue
<template>
  <view class="mode-demo">
    <wd-img width="100%" height="200px" :src="imageUrl" mode="scaleToFill" />
    <view>scaleToFill</view>

    <wd-img width="100%" height="200px" :src="imageUrl" mode="aspectFit" />
    <view>aspectFit</view>

    <wd-img width="100%" height="200px" :src="imageUrl" mode="aspectFill" />
    <view>aspectFill</view>

    <wd-img width="100%" height="200px" :src="imageUrl" mode="top left" />
    <view>top left</view>
  </view>
</template>

<script lang="ts" setup>
import { ref } from 'vue'

const imageUrl = ref('https://example.com/image.jpg')
</script>

圆形与圆角

通过 round 属性将图片显示为圆形,或通过 radius 属性设置自定义圆角大小。

vue
<template>
  <!-- 圆形图片 -->
  <wd-img round width="100" height="100" :src="imageUrl" mode="aspectFill" />

  <!-- 圆角图片 -->
  <wd-img :radius="10" width="100" height="100" :src="imageUrl" />
</template>

<script lang="ts" setup>
import { ref } from 'vue'

const imageUrl = ref('https://example.com/avatar.jpg')
</script>

图片预览

通过 enable-preview 属性开启点击预览功能。可以使用 preview-src 指定预览时使用的高清图片链接。

vue
<template>
  <!-- 点击预览原图 -->
  <wd-img :width="100" :height="100" :src="imageUrl" :enable-preview="true" />

  <!-- 点击预览指定的高清图 -->
  <wd-img
    :width="100"
    :height="100"
    :src="thumbUrl"
    :preview-src="hdImageUrl"
    :enable-preview="true"
  />
</template>

<script lang="ts" setup>
import { ref } from 'vue'

const thumbUrl = ref('https://example.com/thumb.jpg')
const hdImageUrl = ref('https://example.com/hd.jpg')
</script>

注意事项

  1. 加载状态自动管理:组件内部会自动追踪图片的加载状态。当 src 属性发生变化时,状态会自动重置为 loading。开发者无需手动管理状态切换。

  2. 预览功能限制:图片预览功能仅在 enable-previewtrue 且图片加载成功(statussuccess)时才会触发。如果图片加载失败,点击不会触发预览。

  3. 预览图片优先级:当同时设置了 preview-srcsrc 且启用了预览功能时,点击预览会使用 preview-src 作为预览图片。若 preview-src 未设置,则使用 src 进行预览。

  4. 插槽显示逻辑loading 插槽仅在图片加载中时显示,error 插槽仅在图片加载失败时显示。两个插槽同时只能显示一个,图片加载成功后插槽内容会被隐藏。

  5. 尺寸单位widthheightradius 属性支持数字和字符串类型。当传入数字时,默认单位为 px;当传入字符串时,需自行指定单位(如 '100px''50%''2rem')。

  6. 小程序码菜单show-menu-by-longpress 属性仅在微信小程序平台有效,其他平台会被忽略。开启后长按图片会显示识别小程序码菜单。

  7. 样式定制custom-stylecustom-class 作用于组件根节点,custom-image 作用于内部 image 元素。推荐使用这两个属性进行样式定制,避免直接修改组件内部样式。

  8. 懒加载说明lazy-load 属性开启后,图片会在进入屏幕可视区域后才开始加载,适用于长列表、瀑布流等场景,可有效减少首屏加载时间和带宽消耗。

📖 Released under the MIT License