Vue-使用svg-icon

本文介绍了如何在Vue应用中利用SVG可缩放矢量图形创建自定义图标,通过封装SvgIcon组件并配置svg-sprite-loader,实现颜色自定义和全局引用。详细步骤包括SVG组件模板、script和样式编写,以及webpack配置和实际使用的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、svg

  • svg是一种可缩放矢量图形:改变尺寸的情况下其图形质量不会有损失
  • 可自定义填充颜色

2、创建svg-icon组件

由于直接使用svg并不方便,再次我们需要进行进一步封装;在components下新建SvgIcon文件

<template>
  <svg class="__icon" aria-hidden="true">
    <use :xlink:href="fullName"></use>
  </svg>
</template>

<script lang="ts">
import { Options, Vue } from "vue-class-component";

@Options({
  props: {
    name: String,
  },
  computed: {
    fullName() {
      return `#icon_${this.name}`;
    },
  },
})
export default class SvgIcon extends Vue {}
</script>

<style scoped lang="scss">
.__icon {
  width: 1em;
  height: 1em;
  vertical-align: -0.15em;
  fill: currentColor;
  overflow: hidden;
}
</style>

以上代码我们需要注意两点

  • currentColor:css中使用该变量后,用户可自定义color填充颜色
  • fullName:svg名称(symbolId),结合后面svg-sprite-loader配置使用

3、引用SvgIcon组件

  • svg文件路径:@/assets/svg
    在这里插入图片描述

  • 在main.js入口文件注册SvgIcon组件

    import SvgIcon from '@/components/SvgIcon/index.vue'// svg component
    
    // 公用全局本地 svg icon
    const requireAll = (requireContext: any) => requireContext.keys().map(requireContext);
    const req = require.context('@/assets/svg', true, /\.svg$/);
    requireAll(req);
    
    createApp(App)
        .use(store)
        .use(router)
        .component('svg-icon', SvgIcon)
        .mount("#app");
    
    

4、配置

首先安装svg-sprite-loader(npm install svg-sprite-loader --save-dev),完成后在vue.config.js文件进行配置:

const path = require('path');
const resolve = dir => path.join(__dirname, dir);

module.exports = {
    chainWebpack: config => {
        // use svg
        const svgRule = config.module.rule('svg');
        svgRule.uses.clear();
        svgRule.include
            .add(resolve('src/assets/svg')) // svg文件路径
            .end()
            .use('svg-sprite-loader')
            .loader('svg-sprite-loader')
            .options({
                symbolId: 'icon_[name]', // svg-icon组件内部的名称规则
            });
    }
}

5、使用svg-icon

完成以上操作,我们便可以使用svg-icon组件了:

<template>
  <div class="about">
    <h1>This is an about page</h1>
    <svg-icon name="bug" />
  </div>
</template>

页面显示:
在这里插入图片描述
修改颜色:
在这里插入图片描述

### RuoYi Vue 项目中 SVG 图标不显示的解决方案 在 RuoYi 前端 Vue 项目中遇到 `svg-icon` 组件中的图标无法正常显示的问题,通常是因为路径配置错误或是 Webpack 配置不当所致。 #### 检查 SVG 文件加载方式 确保 SVG 文件通过正确的模块化方式进行加载。对于基于 Vue CLI 构建的应用程序,默认情况下会使用 `@svgr/webpack` 或者类似的工具来处理 SVG 文件。如果这些插件未被正确安装或配置,则可能导致打包后的资源丢失[^1]。 #### 修改 Webpack 配置 当发现生产环境下的图标缺失时,应当核查项目的 Webpack 配置文件(通常是 `vue.config.js`),确认是否有关于静态资源解析的相关规则适用于 `.svg` 扩展名。例如: ```javascript module.exports = { chainWebpack: config => { const svgRule = config.module.rule('svg'); // 清除已有的所有 loader。 // 如果你不这样做,接下来的 loader 仍然会应用到 svg 文件上并可能引发问题。 svgRule.uses.clear(); // 添加要替换它的新 loader svgRule.use('babel-loader').loader('babel-loader') .end() .use('svg-sprite-loader').loader('svg-sprite-loader'); // 对其他类型的 assets 进行默认处理... } }; ``` 此段代码修改了 Webpack 中关于如何处理SVG图像的方式,使其能够作为内联 Sprite 被引入而不是单独请求,从而解决了某些情况下由于跨域或其他原因造成的图标加载失败问题[^2]。 #### 更新组件引用风格 为了使自定义样式的设置生效,在模板部分应采用类绑定的形式而非直接属性指定。即把 `<svg-icon>` 标签内的 `class-name` 属性改为动态绑定形式,并移至样式表单中统一管理。这样做的好处是可以更灵活地控制不同状态下的表现效果而不必担心覆盖原有逻辑。 ```html <template> <div> <!-- 使用 v-bind 动态绑定 className --> <svg-icon :icon-class="'avail'" :class-name="customClass"></svg-icon> </div> </template> <script> export default { data() { return { customClass: 'a' } }, methods:{ // ... your methods here } } </script> <style scoped lang='scss'> .a{ font-size: 400px; fill:red !important; /* 注意这里去掉分号 */ } </style> ``` 以上措施可以有效改善 RuoYi Vue 应用中存在的 SVG 显示异常现象。需要注意的是,具体实现细节可能会因版本差异而有所不同,请参照官方文档获取最新指导信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值