在vue-cli3中优雅的使用 icon
- 首先我们得有图标
- 这里我们从网上下载svg文件或者UI给你导出svg文件
- 我们在src 文件下新建一个放置svg 文件 的文件夹 @/src/icons.将所有 icon 放在这个文件夹下。

- 创建 icon-component 组件

<template>
<svg
:class="svgClass"
aria-hidden="true"
:color="svgColor"
>
<use :xlink:href="iconName" />
</svg>
</template> <script lang="ts">
import { Component, Vue, Prop } from 'vue-property-decorator'; @Component({ components: {} })
export default class SvgIcon extends Vue {
@Prop({ default: null, type: String })
iconClass!: String; @Prop({ default: '', type: String })
className!: String; @Prop({ default: null, type: String })
svgColor!: String; get iconName() {
return `#icon-${this.iconClass}`;
} get svgClass() {
if (this.className) return `svg-icon ${this.className}`;
return 'svg-icon';
}
}
</script> <style scoped>
.svg-icon {
width: 2em;
height: 2em;
vertical-align: -0.15em;
fill: currentColor;
overflow: hidden;
}
</style>
- 在icons 文件夹放一个index.js 这个js 的作用是引入 icon组件并全局注册 并实现 自动引入
@/src/icons下面所有的图标了- 之后我们就要使用到 webpack 的 require.context。很多人对于
require.context可能比较陌生,直白的解释就是- require.context("./test", false, /.test.js$/); 这行代码就会去 test 文件夹(不包含子目录)下面的找所有文件名以
.test.js结尾的文件能被 require 的文件。 更直白的说就是 我们可以通过正则匹配引入相应的文件模块。
import Vue from 'vue';
import IconSvg from '@/components/IconSvg/IconSvg.vue'; // 全局注册icon-svg
Vue.component('icon-svg', IconSvg); // requires and returns all modules that match
const requireAll = requireContext => requireContext.keys().map(requireContext);
// import all svg
const req = require.context('./svg', true, /\.svg$/);
requireAll(req);
- 之后我们就要使用到 webpack 的 require.context。很多人对于
- svg-sprite-loader 依赖 install
- 它是一个 webpack loader ,可以将多个 svg 打包成
svg-sprite。 - 我们发现
vue-cli默认情况下会使用url-loader对svg进行处理,会将它放在/img目录下,所以这时候我们引入svg-sprite-loader会引发一些冲突。 //默认`vue-cli` 对svg做的处理,正则匹配后缀名为.svg的文件,匹配成功之后使用 url-loader 进行处理。
{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,
name: utils.assetsPath('img/[name].[hash:7].[ext]')
}
}
- 它是一个 webpack loader ,可以将多个 svg 打包成
- 解决方案有两种,最简单的就是你可以将 test 的 svg 去掉,这样就不会对svg做处理了,当然这样做是很不友善的。
- 你不能保证你所有的 svg 都是用来当做 icon的,有些真的可能只是用来当做图片资源的。
- 不能确保你使用的一些第三方类库会使用到 svg。
- 所以最安全合理的做法是使用 webpack 的 exclude 和 include ,让
svg-sprite-loader只处理你指定文件夹下面的 svg,url-loaer只处理除此文件夹之外的所以 svg,这样就完美解决了之前冲突的问题。 代码如下 
- 这只是cli2 的配置, cli3 配置都在vue.config.js 里面 详情参看文档 webpack相关 | vue-cli3
- 这里吧我自己写的给贴出来
module.exports = {
lintOnSave: true,
baseUrl: './',
productionSourceMap: process.env.NODE_ENV !== 'production',
chainWebpack: (config) => {
config.resolve.alias.set('@images', resolve('./src/assets/images'));
config.resolve.alias.set('@svg', resolve('./src/icons/svg'));
config.module.rules.delete('svg'); // 重点:删除默认配置中处理svg,
config.module
.rule('svg-sprite-loader')
.test(/\.svg$/)
.include
.add(resolve('src/icons/svg')) // 处理svg目录
.end()
.use('svg-sprite-loader')
.loader('svg-sprite-loader')
.options({
symbolId: 'icon-[name]',
});
},
......
- 解决方案有两种,最简单的就是你可以将 test 的 svg 去掉,这样就不会对svg做处理了,当然这样做是很不友善的。
这样配置好了,开始使用了.

<icon-svg
icon-class="send"
className="icon"
/>
效果
参考链接: 手摸手,带你优雅的使用 icon
更详细的 可以去看看上面链接,大神带你飞
在vue-cli3中优雅的使用 icon的更多相关文章
- Vue Cli3 中别名的配置问题
Vue Cli3 中别名的配置问题 vue-cli3中是没有config.build等目录的,这是因为vue-cli3中将这些配置隐藏起来了,如果想要修改,可以在vue.config.js文件中进行修 ...
- @vue/cli3中解决Elint中console.log报错的问题
方法一:package.json中”eslintConfig”>"rules”字段添加如下代码 "no-console": "off", &qu ...
- 「Vue」Vue cli3中引用mui-ui问题及解决办法
1.引用mui.js无效,top-bar划动,numbox点击无效等问题 解决办法: -main.js中import mui from './lib/mui/js/mui.js' Vue.protot ...
- 「Vue」vue cli3中axios的基本用法
1.安装axiosnpm i axios -S2.main.js中设置import axios from 'axios'Vue.prototype.$axios = axiosPS:这里有个小坑,ax ...
- 如何在Vue项目中优雅的使用sass
开始之前,请先确保有一个基于webpack模板的项目(vue-cli脚手架一键安装~) 1.打开项目终端,安装sass的依赖包 npm install --save-dev sass-loader / ...
- 如何在Vue项目中优雅的使用swiper插件
个人网站 https://iiter.cn 程序员导航站 开业啦,欢迎各位观众姥爷赏脸参观,如有意见或建议希望能够不吝赐教! 开始之前,请先确保有一个基于webpack模板的项目(vue-cli脚手架 ...
- 【土旦】在vue filters中 优雅的使用对象的key、value来替换 if switch多重判断简化流程
前言 之前写过滤器的时候都是 用 if switch 来进行值的判断 返回对应的值, 在没去百度搜索之前都是都是这样写的 ) { return "支付成功"; } ) { retu ...
- vue cli3以上的项目中如何使用axois请求本地json文件
首先明确一点,在vue cli3以上的版本中,存放静态资源的文件是public 我刚开始以为是和vue cli2一样需要放在static文件夹下,但是项目中没有这个文件夹,我就自己创建了一个,结果请求 ...
- 前端vue开发中的跨域问题解决,以及nginx上线部署。(vue devServer与nginx)
前言 最近做的一个项目中使用了vue+springboot的前后端分离模式 在前端开发的的时候,使用vue cli3的devServer来解决跨域问题 上线部署则是用的nginx反向代理至后台服务所开 ...
随机推荐
- 状压dp(状态压缩&&dp结合)学习笔记(持续更新)
嗯,作为一只蒟蒻,今天再次学习了状压dp(学习借鉴的博客) 但是,依旧懵逼·································· 这篇学习笔记是我个人对于状压dp的理解,如果有什么不对的 ...
- 02-oracle中的基础sql
1.SQL SQL(Structured Query Language) 语言是目前主流的关系型数据库上执行数据操作.数据检索以及数据库维护所需要的标准语言,是用户与数据库之间进行交流的接口,许多关系 ...
- ACM-ICPC 2018 沈阳赛区网络预赛 B Call of Accepted(表达式求值)
https://nanti.jisuanke.com/t/31443 题意 给出一个表达式,求最小值和最大值. 表达式中的运算符只有'+'.'-'.'*'.'d',xdy 表示一个 y 面的骰子 ro ...
- 分页之 skip(pageindex*(index-1).take(size).Tolist();
grdView.DataSource = Select().Skip(pageSize * (start - 1)).Take(rows).ToList();这个分页性能上并不高下面是我的分页 1 2 ...
- CentOS 6.6 系统升级到 CentOS 6.7
1.利用Centos6.7 ISO镜像挂载为本地镜像 创建一个挂载目录 CentOS 6.6 系统升级到 CentOS 6.7 mkdir /mnt/data 2.挂载镜像(远程镜像) mount - ...
- 迅为IMX6Q PLUS开发板烧写Android6.0系统方法
平台:迅为IMX6Q PLUS开发板工具:MfgTool2 工具 镜像文件在光盘目录“03 镜像_android 6.0.1 文件系统”下.其中商业级核心板为 2G内存镜像,工业级核心板为 1G 内存 ...
- Visual Studio Code(VS code)你们都在用吗?或许你们需要看一下这篇博文
写在前面 在前端开发中,有一个非常好用的工具,Visual Studio Code,简称VS code. 都不用我安利VS code,大家就会乖乖的去用,无数个大言不惭的攻城狮,都被VS code比德 ...
- 微信小程序出现 Expecting 'STRING','NUMBER','NULL','TRUE','FALSE','{','[', got INVALID
是因为,app.json中不能有注释,我将我上面注释的部分去掉,就可以了
- vue内置的标签(组件)
component:用于动态组件,查看博文vue学习之组件. <component :is="componentId"></component> trans ...
- Python multiprocessing
 推荐教程 官方文档 multiprocess各个模块较详细介绍 廖雪峰教程--推荐 Pool中apply, apply_async的区别联系 (推荐)python多进程的理解 multiproce ...