SvgIcon全局组件---开发环境:vue3+vuecli5

发布时间 2023-10-17 19:45:53作者: pwindy

开发背景

node v18.17.0(node -v)
npm v8.4.1(npm -v)
@vue/cli 5.0.8(vue -V)

0.SvgIcon全局组件

全局组件是指在应用程序的任何位置使用的组件,使用全局组件前需要在Vus.js实例中注册,并将其挂载到实例中。全局组件是可复用的Vus.js实例。

1.安装依赖svg-sprite-loader

  npm install svg-sprite-loader -D

安装成功后,在package.json文件中可以看到安装成功的版本号

2.下载并存放svg图标文件

2.1.在iconfont-阿里巴巴矢量图标库中下载svg文件

下载的svg文件分别命名homeIndex.svg,news.svg,newsCategory.svg

2.2.把下载的svg图标放进项目文件夹里

src文件下面的components文件夹,新建svgIcon文件夹,svgIcon文件夹下面新建icon文件夹,把下载的svg图标文件放到icon文件夹里

 

3.批量导入SVG图标文件

3.1.新建svg.js文件

src文件下面的components文件夹,新建svgIcon文件夹,svgIcon文件夹下面新建svg.js文件,svg.js文件的内容如下:

    // 获取当前icon目录所有以.svg为后缀的文件
    const context = require.context('./icon', false, /\.svg$/)
    // 解析获取.svg文件的文件名称,并返回
    const requireAll = (requireContext) => requireContext.keys().map(requireContext)
    // 执行
    requireAll(context)

3.2.导入新建的svg.js文件

在src文件夹下面的main.js文件加入如下代码

      import "./components/svgIcon/svg.js" // 批量导入svg文件

4.新建SvgIcon全局组件

4.1.新建组件文件Index.vue

src文件下面的components文件夹,新建svgIcon文件夹,svgIcon文件夹下面新建Index.vue文件,Index.vue文件的内容如下:

    iconName和className属性是从引用SvgIcon组件的父组件传递过来的
    <template>
        <svg :class="svgClassName" aria-hidden="true">
            <use :xlink:href="svgIcon"></use>
        </svg>
    </template>

    <script>
    import { ref, computed } from "vue"
    export default {
        name: 'SvgIcon',
        props: {
            iconName: {
                type: String,
                default: ""
            },
            className: {
                type: String,
                default: ""
            },
        },
        setup(props) {
            const svgClassName = computed(() => {
                if(props.className){
                    return `svg_class ${props.className}`
                }
                return "svg_class"
            })
            const svgIcon = computed(() => `#icon-${props.iconName}`)
            return { svgClassName, svgIcon }
        }

    };
    </script>

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

 4.2.导入新建组件文件Index.vue

在src文件夹下面的main.js文件加入如下代码

    import SvgIcon from "./components/svgIcon/Index.vue"

    const app = createApp(App)

    app
    .component("svg-icon", SvgIcon)
    .mount("#app");

5.配置svg-sprite-loader插件

在vue.config.js文件的chainWebpack对象进行如下配置和解析

5.1.当vue/cli的版本号为 5.0的情况