vue使用图片的四种类型详解

 更新时间:2026年07月09日 09:26:27   作者:weixin_42339193  
想在Vue项目中正确显示图片?别再踩坑了!本文对比img标签、动态绑定:src、require引入及自定义组件等6种图片加载方式,手把手教你应对静态资源、动态路径和性能优化,点击立即掌握最佳实践,告别图片显示异常

1、普通<img>标签(静态图片)

直接通过 src 属性指定图片路径,适用于静态资源(如存放在 public 目录下的图片)。

<template>
  <img src="/images/logo.png" alt="logo" />
    //或者
  //<img src="@asstes/images/logo.png" alt="logo" />
</template>

特点

  • 图片路径为绝对路径,会直接映射到项目的根目录。
  • 无需经过 Webpack 等构建工具处理,适合不需要编译的静态文件(如 avicon、第三方图片)。

2、动态绑定:src(动态图片路径)

通过 Vue 的响应式特性,使用 v-bind:src)动态绑定图片路径,适用于变量控制的图片地址(如从后端接口获取的图片 URL)

<template>
  <img :src="imageUrl" alt="Dynamic Image" />
</template>
<script>
export default {
  data() {
    return {
      imageUrl: 'https://example.com/image.jpg', // 可来自接口或组件状态
    };
  },
};
//如果使用此种方式还是不显示图片的话可以使用import 引用 (一般使用静态资源时未能获取到绝对路径)
import img1 from "@/asstes/img/picter1.png"
export default {
  data() {
    return {
      imageUrl: img1, // 可来自接口或组件状态
    };
  },
};
</script>

场景

  • 加载用户头像、商品图片等后端返回的动态资源。
  • 配合计算属性或 Watcher 实现更复杂的动态逻辑。

3、使用require引入(Webpack 处理的图片,vite同理)

当图片存放在 src 目录下(如 src/assets/images)时,需通过 require 或 ES6 的 import 引入,适用于需要打包编译的静态资源

<template>
  <!-- 方式 1:在模板中直接 require -->
  <img :src="require('@/assets/images/logo.png')" alt="Logo" />
  <!-- 方式 2:在数据中提前引入 -->
  <img :src="logoImg" alt="Logo" />
</template>
<script>
export default {
  data() {
    return {
      // 方式 2:在 data 中通过 import 或 require 引入
      logoImg: require('@/assets/images/logo.png'),
      // 或:import logoImg from '@/assets/images/logo.png';
    };
  },
};
</script>

特点

  • 图片会被 Webpack 等构建工具处理,支持 ** 文件压缩、路径别名(如 @ 代表 src 目录)** 等功能。
  • 适合项目内的静态资源管理(如主题图片、图标)。

4、使用 Vue 组件封装(自定义图片组件)

将图片渲染逻辑封装为组件,支持统一处理加载状态、错误提示等功能。

<!-- 自定义图片组件 -->
<template>
  <div class="image-container">
    <img 
      :src="src" 
      :alt="alt" 
      @load="onLoad" 
      @error="onError"
    />
    <!-- 加载中提示 -->
    <div v-show="loading" class="loading">Loading...</div>
    <!-- 错误提示 -->
    <div v-show="error" class="error">图片加载失败</div>
  </div>
</template>
<script>
export default {
  props: {
    src: {
      type: String,
      required: true,
    },
    alt: {
      type: String,
      default: '',
    },
  },
  data() {
    return {
      loading: true,
      error: false,
    };
  },
  methods: {
    onLoad() {
      this.loading = false;
    },
    onError() {
      this.error = true;
      this.loading = false;
    },
  },
};
</script>

使用:

<template>
  <CustomImage 
    src="https://example.com/image.jpg" 
    alt="Custom Image"
  />
</template>

优势

  • 解耦图片渲染逻辑,可复用加载状态、错误处理等功能。
  • 方便扩展功能(如图片懒加载、图片预览等)。

补充:AI建议:

5、使用 SVG 图标(矢量图)

若需使用 SVG 图标,可直接引入或通过组件封装(如vue-svg-icon插件)。

<!-- 直接引入 SVG -->
<template>
  <svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg">
    <path d="M12 2L1 21h22L12 2z" fill="currentColor" />
  </svg>
</template>
<!-- 使用 vue-svg-icon 组件 -->
<template>
  <svg-icon name="home" />
</template>
<script>
import { SvgIcon } from 'vue-svg-icon/ssr';
export default {
  components: {
    SvgIcon,
  },
};
</script>

特点

  • 矢量图不模糊,适合图标类场景。
  • 可通过 CSS 灵活控制颜色、尺寸等样式。

6、图片懒加载(优化性能)

对于长列表或视窗外的图片,可使用 vue-lazyload 插件实现懒加载,减少首屏请求量。

<!-- 安装插件:npm install vue-lazyload -->
<template>
  <img v-lazy="imageUrl" alt="Lazy Image" />
</template>
<script>
import VueLazyload from 'vue-lazyload';
export default {
  directives: {
    lazy: VueLazyload,
  },
  data() {
    return {
      imageUrl: 'https://example.com/large-image.jpg',
    };
  },
};
</script>

配置:

Vue.use(VueLazyload, {
  loading: require('@/assets/loading.gif'), // 加载中占位图
  error: require('@/assets/error.jpg'), // 加载失败占位图
});

总结对比

场景推荐写法特点
静态资源(public)<img src="/path" />直接引用,无需构建处理
动态路径(接口数据):src="imageUrl"响应式绑定,支持后端返回的 URL
项目内资源(src)require/import需经 Webpack 处理,支持路径别名和打包优化
复杂逻辑(加载状态)自定义组件封装复用,可扩展加载状态、错误处理等功能
矢量图标SVG 直接引入或组件高清无锯齿,支持样式灵活控制
性能优化(懒加载)vue-lazyload 指令减少首屏请求,适合长列表或大屏图片

补充:记录一个vue3 setup 中 自定组件的语法糖 

当你使用 defineProps() 宏定义组件属性时:

  1. 类型推导与运行时绑定:Vue 会根据你提供的类型信息(如 StatsCardProps 接口),同时生成类型定义运行时 props 选项
  2. 自动注入到模板作用域:通过 defineProps() 定义的 props 会被自动注入到模板的上下文中,无需额外导入或声明。

子组件:

<script setup lang="ts">
interface StatsCardProps {
  title?: string;
  color?: string;
  // 其他props...
}
// defineProps<StatsCardProps>() 会生成:
// - 类型定义:props.title 类型为 string | undefined
// - 运行时:等价于 props: { title: String, color: String }
</script>
<template>
  <div :style="{ backgroundColor: color }">{{ title }}</div> <!-- 直接使用props -->
</template>

父组件

<cardList
              :id="card.id"
              :title="card.title"
              :color="card.color"
            />

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • mini-vue渲染的简易实现

    mini-vue渲染的简易实现

    本文主要介绍了mini-vue渲染的简易实现,主要简单来实现一个虚拟dom渲染真实dom,以及更新的方法。具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • element-ui vue input输入框自动获取焦点聚焦方式

    element-ui vue input输入框自动获取焦点聚焦方式

    这篇文章主要介绍了element-ui vue input输入框自动获取焦点聚焦方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • 自定义Vue中的v-module双向绑定的实现

    自定义Vue中的v-module双向绑定的实现

    这篇文章主要介绍了自定义Vue中的v-module双向绑定的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • 详解vue3中setUp和reactive函数的用法

    详解vue3中setUp和reactive函数的用法

    这篇文章主要介绍了vue3函数setUp和reactive函数的相关知识及setup函数和reactive函数的注意点,通过具体代码给大家介绍的非常详细,需要的朋友可以参考下
    2021-06-06
  • 基于Vue实现一个textarea幽灵建议功能

    基于Vue实现一个textarea幽灵建议功能

    不知道你有没有发现Bing AI聊天有个输入提示功能,在用户输入部分内容时后面会给出灰色提示文案,用户只要按下tab键就可以快速添加提示的后续内容,我将这个功能称为幽灵建议,接下来我将用Vue框架来实现这个功能,需要的朋友可以参考下
    2023-09-09
  • axios前端访问后端携带cookie的代码实例

    axios前端访问后端携带cookie的代码实例

    当用户在网站登录后,服务器会在其浏览器上设置一个包含登录信息的Cookie,通过这个Cookie,服务器能够识别用户是否已登录,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-09-09
  • 详解vue3.2中setup语法糖<script lang="ts" setup>

    详解vue3.2中setup语法糖<script lang="ts" setup>

    Vue 3.2 引入了语法,这是一种稍微不那么冗长的声明组件的方式,下面这篇文章主要介绍了详解vue3.2中setup语法糖<script lang="ts"setup>的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-01-01
  • vue中@keyup.enter失效问题及解决

    vue中@keyup.enter失效问题及解决

    这篇文章主要介绍了vue中@keyup.enter失效问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • vue中mint-ui的使用方法

    vue中mint-ui的使用方法

    这篇文章主要为大家详细介绍了vue中mint-ui的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04
  • 结合el-upload组件实现大文件分片上传功能

    结合el-upload组件实现大文件分片上传功能

    Element UI的el-upload上传组件相信各位小伙伴都已经非常熟悉,最近接了一个新需求,要求在el-upload组件基础上实现分片上传功能,即小于等于5M文件正常上传,大于5M文件切成5M每片上传,那么这个功能怎么实现呢?一起看看吧
    2022-09-09

最新评论