You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue.js实现动态图标加载:存在显示Logo,否则用默认mdi-home

Vue.js 实现动态加载公司Logo(失败自动显示默认图标)

方法一:直接绑定图片的 error 事件

这是最直接的实现方式,无需额外封装,利用图片原生的error事件触发切换逻辑:

<template>
  <div class="home-icon">
    <!-- 优先加载对应公司的Logo -->
    <img 
      v-if="company && !useDefaultIcon"
      :src="`/assets/logos/${company}.png`" 
      alt="公司Logo"
      @error="useDefaultIcon = true"
    >
    <!-- Logo加载失败或无公司信息时,显示默认图标 -->
    <span v-else class="mdi mdi-home"></span>
  </div>
</template>

<script>
export default {
  data() {
    return {
      useDefaultIcon: false,
      // 替换成你实际获取company的方式,比如从store、接口或本地存储
      company: this.$store.state.currentCompany 
    }
  }
}
</script>

核心逻辑:约定公司Logo的命名规则(用company变量的值作为文件名),放在固定目录(比如/assets/logos/)。新客户接入时,只需把他们的Logo按规则放到该目录,完全不用修改代码。当图片加载失败(文件不存在),@error事件触发,将useDefaultIcon设为true,自动切换到默认的mdi-home图标。

方法二:封装成全局自定义指令(适合多处复用)

如果项目中多个地方需要这种“加载失败切默认图”的逻辑,可以封装成自定义指令,提升复用性:

// 在main.js中注册全局指令
Vue.directive('fallback-icon', {
  inserted(el, binding) {
    // 监听图片加载失败事件
    el.onerror = function() {
      // 隐藏加载失败的图片
      el.style.display = 'none';
      // 创建默认图标元素
      const iconEl = document.createElement('span');
      // 指令传参指定默认图标类名,默认用mdi-home
      iconEl.className = binding.value || 'mdi mdi-home';
      // 将图标插入到图片的父节点
      el.parentNode.appendChild(iconEl);
    }
  }
})

在任意组件中直接使用:

<template>
  <img 
    v-fallback-icon="'mdi mdi-home'"
    :src="`/assets/logos/${company}.png`" 
    alt="公司Logo"
  >
</template>

关键注意点

  • 统一Logo的命名与存储路径是实现“零代码新增客户”的核心,比如所有Logo命名为[company标识].png,存放在/assets/logos/目录下。
  • Vue CLI项目需注意静态资源的打包规则,确保/assets/logos/下的文件能被正确访问。
  • 若公司标识包含特殊字符,需提前处理文件名兼容性(比如转义、替换特殊字符)。

内容的提问来源于stack exchange,提问作者Nelson Torres

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 11:32:44