当前位置:首页 > VUE

vue实现图片组件

2026-03-10 08:06:12VUE

Vue 图片组件的实现方法

基础图片组件实现

创建一个基础的图片组件,支持动态传入图片路径和替代文本。

<template>
  <img :src="src" :alt="alt" :class="className" />
</template>

<script>
export default {
  name: 'BaseImage',
  props: {
    src: {
      type: String,
      required: true
    },
    alt: {
      type: String,
      default: ''
    },
    className: {
      type: String,
      default: ''
    }
  }
}
</script>

懒加载图片组件

使用Intersection Observer API实现图片懒加载,提升页面性能。

<template>
  <img
    ref="image"
    :src="placeholder"
    :alt="alt"
    :class="className"
    @load="handleLoad"
  />
</template>

<script>
export default {
  name: 'LazyImage',
  props: {
    src: {
      type: String,
      required: true
    },
    placeholder: {
      type: String,
      default: 'data:image/png;base64,...'
    },
    alt: {
      type: String,
      default: ''
    },
    className: {
      type: String,
      default: ''
    }
  },
  mounted() {
    const observer = new IntersectionObserver((entries) => {
      entries.forEach(entry => {
        if (entry.isIntersecting) {
          this.$refs.image.src = this.src
          observer.unobserve(this.$refs.image)
        }
      })
    })
    observer.observe(this.$refs.image)
  },
  methods: {
    handleLoad() {
      this.$emit('loaded')
    }
  }
}
</script>

响应式图片组件

根据设备屏幕大小加载不同尺寸的图片。

<template>
  <picture>
    <source 
      v-for="(source, index) in sources" 
      :key="index"
      :media="source.media"
      :srcset="source.srcset"
    >
    <img :src="fallback" :alt="alt" :class="className">
  </picture>
</template>

<script>
export default {
  name: 'ResponsiveImage',
  props: {
    sources: {
      type: Array,
      required: true,
      validator: value => value.every(item => 
        'media' in item && 'srcset' in item
      )
    },
    fallback: {
      type: String,
      required: true
    },
    alt: {
      type: String,
      default: ''
    },
    className: {
      type: String,
      default: ''
    }
  }
}
</script>

图片加载状态处理

添加加载中和加载失败的状态处理。

vue实现图片组件

<template>
  <div class="image-container">
    <img
      v-show="!isLoading && !hasError"
      :src="src"
      :alt="alt"
      @load="handleLoad"
      @error="handleError"
    >
    <div v-if="isLoading" class="loading-placeholder">
      <!-- 加载中状态 -->
    </div>
    <div v-if="hasError" class="error-placeholder">
      <!-- 加载失败状态 -->
    </div>
  </div>
</template>

<script>
export default {
  name: 'ImageWithStatus',
  props: {
    src: {
      type: String,
      required: true
    },
    alt: {
      type: String,
      default: ''
    }
  },
  data() {
    return {
      isLoading: true,
      hasError: false
    }
  },
  methods: {
    handleLoad() {
      this.isLoading = false
      this.hasError = false
    },
    handleError() {
      this.isLoading = false
      this.hasError = true
    }
  }
}
</script>

<style>
.image-container {
  position: relative;
}
.loading-placeholder,
.error-placeholder {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
}
</style>

这些实现方法可以根据具体需求进行组合或扩展,构建适合项目需求的图片组件。

标签: 组件图片
分享给朋友:

相关文章

vue实现组件拖放

vue实现组件拖放

Vue 实现组件拖放的方法 使用 HTML5 原生拖放 API HTML5 提供了原生的拖放 API,可以通过 draggable 属性、dragstart、dragend、dragover 和 dr…

vue实现图片轮播

vue实现图片轮播

Vue 实现图片轮播的方法 使用第三方库(推荐) 安装 vue-awesome-swiper 库,这是基于 Swiper 的 Vue 封装: npm install swiper vue-aweso…

vue实现图片

vue实现图片

Vue 实现图片展示的方法 在 Vue 中实现图片展示可以通过多种方式完成,以下是一些常见的方法: 使用 img 标签直接引入 通过 img 标签的 src 属性直接引入本地或远程图片: <…

H5图片实现地图

H5图片实现地图

实现H5图片地图的方法 在H5中实现图片地图功能,可以通过以下方式完成。图片地图允许用户在图片的特定区域点击,触发不同的交互效果。 使用HTML的<map>和<area>标签…

vue实现水印组件

vue实现水印组件

Vue 水印组件的实现方法 使用Canvas绘制水印 在Vue组件中通过Canvas动态生成水印图案,将其作为背景添加到目标元素上。 <template> <div ref="…

如何缓存react组件

如何缓存react组件

缓存React组件的方法 React.memo 使用React.memo对函数组件进行浅比较缓存,避免不必要的重新渲染。适用于props不变的场景。 const MemoizedComponen…