|
@@ -0,0 +1,139 @@
|
|
|
+# 在vue项目中使用SVG
|
|
|
+> 本文包含了在vue项目中使用SVG的方法, 包含vue2.x和vue3.x
|
|
|
+
|
|
|
+## vue2.x使用
|
|
|
+#c 依赖组件介绍
|
|
|
+我们主要使用 `svg-sprite-loader` 来引入组件
|
|
|
+使用webpack中的require.context来批量引入svg文件
|
|
|
+
|
|
|
+#d 新旧vue cli 差异
|
|
|
+> [新版本vue cli项目无法生效参考文章](https://juejin.cn/post/7133523073680015396)
|
|
|
+
|
|
|
+在新版本的vue cli项目中更改了svg文件的加载方式
|
|
|
+所以我们需要将新版本的svg加载项进行更改, 删除新增的内容
|
|
|
+
|
|
|
+
|
|
|
+#e 配置svg文件的加载
|
|
|
+vue.config.js 配置如下
|
|
|
+```js
|
|
|
+
|
|
|
+const path = require('path')
|
|
|
+function resolve(dir) {
|
|
|
+ // console.log(dir);
|
|
|
+ return path.join(__dirname, dir);
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+module.exports = defineConfig({
|
|
|
+ ...outherConfig,
|
|
|
+ chainWebpack: config => {
|
|
|
+ config.plugin('define').tap(args=>{
|
|
|
+ const argv = process.argv
|
|
|
+ const icourt = argv[argv.indexOf('--icourt-mode') + 1]
|
|
|
+ args[0]['process.env'].MODE = `"${icourt}"`
|
|
|
+ return args
|
|
|
+ })
|
|
|
+ const svgRule = config.module.rule('svg')
|
|
|
+ svgRule.uses.clear()
|
|
|
+ // 清除已有的svg loader https://juejin.cn/post/7133523073680015396
|
|
|
+ svgRule.delete('type');
|
|
|
+ svgRule.delete('generator');
|
|
|
+ svgRule.exclude.add(/noe_modules/)
|
|
|
+ svgRule
|
|
|
+ .test(/\.svg/)
|
|
|
+ .use('svg-sprite-loader')
|
|
|
+ .loader('svg-sprite-loader')
|
|
|
+ .options({
|
|
|
+ symbolId: 'icon-[name]'
|
|
|
+ })
|
|
|
+ const imagesRule = config.module.rule('images')
|
|
|
+ imagesRule.exclude.add(resolve('./src/assets/svg'))
|
|
|
+ // console.log('imagesRule',imagesRule)
|
|
|
+ config.module
|
|
|
+ .rule('images')
|
|
|
+ .test(/\.(png|jpe?g|gif|svg)(\?.*)?$/)
|
|
|
+
|
|
|
+ }
|
|
|
+})
|
|
|
+```
|
|
|
+
|
|
|
+
|
|
|
+#c 注册并引用svg组件
|
|
|
+使用 webpack 中的require.context来批量引入svg文件,
|
|
|
+并将svg组件注册为vue组件, 这样我们就可以在项目中使用svg了
|
|
|
+为了能够同时使用网络上的svg图标, 设置组件参数`svgHref`属性,
|
|
|
+用于直接引入网络上的svg图标
|
|
|
+
|
|
|
+#e 注册与组件
|
|
|
+这里我们将svg文件统一放置于`src/assets/svg`目录中, `@`为`src`的别名(alias)
|
|
|
+iconIndex.js
|
|
|
+```js
|
|
|
+import Vue from 'vue'
|
|
|
+import SvgIcon from './iconSvg' // svg组件
|
|
|
+
|
|
|
+// 注册到全局
|
|
|
+Vue.component('svg-icon', SvgIcon)
|
|
|
+
|
|
|
+const requireAll = requireContext => requireContext.keys().map(requireContext)
|
|
|
+const req = require.context('@/assets/svg', false, /\.svg$/)
|
|
|
+requireAll(req)
|
|
|
+```
|
|
|
+svg-icon.vue
|
|
|
+```vue
|
|
|
+<template>
|
|
|
+ <svg class="svg-icon" aria-hidden="true">
|
|
|
+ <image v-if="svgHref" :xlink:href="svgHref" />
|
|
|
+
|
|
|
+ <use v-else :xlink:href="_iconName"/>
|
|
|
+<!-- 使用 链接 加载 svg-->
|
|
|
+ </svg>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script>
|
|
|
+export default {
|
|
|
+ name: 'SvgIcon',
|
|
|
+ props: {
|
|
|
+ iconClass: {
|
|
|
+ type: String,
|
|
|
+ default: '',
|
|
|
+ },
|
|
|
+ svgHref: {
|
|
|
+ type: String,
|
|
|
+ default: '',
|
|
|
+ },
|
|
|
+ },
|
|
|
+ computed: {
|
|
|
+ _iconName () {
|
|
|
+ return `#icon-${this.iconClass}`
|
|
|
+ },
|
|
|
+ },
|
|
|
+}
|
|
|
+</script>
|
|
|
+
|
|
|
+<style scoped>
|
|
|
+.svg-icon {
|
|
|
+ width: 1em;
|
|
|
+ height: 1em;
|
|
|
+ vertical-align: -0.15em;
|
|
|
+ fill: currentColor;
|
|
|
+ overflow: hidden;
|
|
|
+}
|
|
|
+.svg-icon image {
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+ fill: currentColor;
|
|
|
+}
|
|
|
+</style>
|
|
|
+```
|
|
|
+
|
|
|
+#e 使用组件
|
|
|
+在对应的svg目录放置好svg文件后, 在需要使用的地方直接调用组件即可
|
|
|
+例如放置 user.svg, 在使用的时候只需要使用如下代码即可,
|
|
|
+`icon-class`属性填写svg文件的文件名即可
|
|
|
+```vue
|
|
|
+<template>
|
|
|
+ <div class="div">
|
|
|
+ <svg-icon icon-class="user" />
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+```
|