• vue3 封装svg组件,全局使用svg Bing


    npm i svg-sprite-loader

    vue.config.js:黑体字部分

    const path = require('path')
    
    function resolve(dir) {
      return path.join(__dirname, '.', dir)
    }
    
    module.exports = {
        transpileDependencies: true,
            lintOnSave: false,
        chainWebpack: config => {
                config.module.rules.delete("svg"); //重点:删除默认配置中处理svg,
                config.module
                    .rule('svg-sprite-loader')
                    .test(/\.svg$/)
                    .include
                    .add(resolve('src/icons')) //处理svg目录
                    .end()
                    .use('svg-sprite-loader')
                    .loader('svg-sprite-loader')
                    .options({
                        symbolId: 'icon-[name]'
                    })
                config
                    .plugin('html')
                    .tap(args => {
                        args[0].title = "MetrologyWorks";
                        return args;
                    }).end()
                config.module
                    .rule('pdf')
                    .test(/\.pdf$/)
                    .use('pdf')
                    .loader('file-loader')
                    .end()
        },
        pluginOptions: {
            electronBuilder: {
                nodeIntegration: true
            }
        }
    }

    src下新建目录结构 icons:

     index.js:

    const requireAll = requireContext => requireContext.keys().map(requireContext)
    const req = require.context('./svg', false, /\.svg$/)
    requireAll(req)

    SvgIcon.vue:

    <template>
        <svg :class="svgClass" aria-hidden="true">
            <use :xlink:href="iconName" />
        </svg>
    </template>
    
    <script>
        export default {
            name: "SvgIcon",
            props: {
                iconClass: {
                    type: String,
                    required: true,
                },
                className: {
                    type: String,
                    default: '',
                },
            },
            computed: {
                iconName() {
                    return `#icon-${this.iconClass}`
                },
                svgClass() {
                    if (this.className) {
                        return 'svg-icon ' + this.className
                    } else {
                        return 'svg-icon'
                    }
                },
            }
        }
    </script>
    
    <style scoped>
    .svg-icon {
       1em;
      height: 1em;
      fill: currentColor;
      overflow: hidden;
      vertical-align: middle;
    }
    </style>

    main.js:

    import './icons'
    import SvgIcon from '@/icons/SvgIcon'
    
    async function startup() {
    
        await configure();
    
        const app = createApp(App)
    
        app.component('svg-icon', SvgIcon)
    
        app.use(ElementPlus)
        app.use(router)
    
        app.mount('#app')
    }

    使用方式:

    <template>
      <div class="real-time-data">
        <svg-icon icon-class="realData"></svg-icon> <span>实时数据</span>
      </div>
    </template>
    
    <script>
    export default {
      data () {
        return {
        }
      }
    }
    </script>
    
    <style lang="scss" scoped>
    .real-time-data {
      line-height: 45px;
      font-size: 14px;
      color: #666;
      cursor: pointer;
    }
    </style>

     

  • 相关阅读:
    【poj3017】 Cut the Sequence
    【vijos1243】 生产产品
    【bzoj3624】Apio2008—免费道路
    【bzoj1912】 Apio2010—patrol 巡逻
    【bzoj2006】 NOI2010—超级钢琴
    【bzoj1178】 Apio2009—CONVENTION会议中心
    【bzoj1503】 NOI2004—郁闷的出纳员
    【bzoj1499】 NOI2005—瑰丽华尔兹
    【poj2823】 Sliding Window
    【poj3264】 Balanced Lineup
  • 原文地址:https://www.cnblogs.com/hahahakc/p/16148798.html
Copyright © 2020-2023  润新知