vite+vue3+vant使用svg图标

做项目时用到了iconfont的几个svg,不晓得咋搞上去,用的van-image和image标签效果都不理想,最后从网上找到了方法,记录下

首先封装一个SvgIcon组件

在components文件夹下新建一个SvgIcon.vue文件

复制代码
<template>
    <svg aria-hidden="true" class="svg-icon">
        <use :xlink:href="symbolId" :fill="color" />
    </svg>
</template>

<script >
import { defineComponent, computed } from 'vue'

export default defineComponent({
    name: 'SvgIcon',
    props: {
        // 使用的svg图标名称,也就是svg文件名
        name: {
            type: String,
            required: true,
        },
        prefix: {
            type: String,
            default: 'icon',
        },
        color: {
            type: String,
            default: '#333',
        }
    },
    setup(props) {
        const symbolId = computed(() => `#${props.prefix}-${props.name}`)
        return { symbolId }
    },
})
</script>
<style scope>
.svg-icon {
    width: 50px;
    height: 50px;
    color: #333;
    fill: currentColor;
}
</style>
复制代码

在使用的地方使用该组件,(用的vant的宫格组件)

复制代码
<!--    宫格-->
    <div class="grid">
        <van-grid>
            <van-grid-item v-for="item in gridData" :key="item.title">
                <SvgIcon class="icon" :name="item.imgName" />
                {{ item.title }}
            </van-grid-item>
        </van-grid>
    </div>
复制代码
复制代码
const gridData = reactive([
    {
        title: '道破',
        imgName: 'daopo' // 名字对应文件名
    },
    {
        title: '赵飞燕',
        imgName: 'feiyan'
    },
    {
        title: '杨贵妃',
        imgName: 'guifei'
    },
    {
        title: '李清照',
        imgName: 'qingzhao'
    },
    {
        title: '武则天',
        imgName: 'wuzetian'
    },
    {
        title: '夏侯',
        imgName: 'xiahou'
    },
    {
        title: '敬爱',
        imgName: 'jingai'
    },
    {
        title: '赵毅',
        imgName: 'zhaoyi'
    }
])
复制代码

 

 去main.js里注册一下组件

import SvgIcon from "@/components/SvgIcon.vue";

createApp(App).use().component('SvgIcon', SvgIcon).mount('#app')

再打开vite.config.js进行配置

复制代码
import { resolve } from 'path'

const pathResolve = (pathStr) => {
  return resolve(__dirname, pathStr)
}

export default defineConfig({
    plugins: [
      vue(),
      createSvgIconsPlugin({
        iconDirs: [pathResolve('./src/assets/grid')], // svg的文件路径
        // 指定symbolId格式(这里的配置与6.2步骤中的引入svg组件的name配置项写法有关)
        symbolId: 'icon-[dir]-[name]',
    })
  ],
})
复制代码

 完成后重新跑一下项目,svg图就出来了

 

posted @   幻影之舞  阅读(1573)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示