>[danger]在vue中使用svg渲染图标
[直接下载代码]([https://github.com/lidongxuwork126com/ldx\_vue/tree/master/Vue%E4%BD%BF%E7%94%A8svg%E5%9B%BE%E6%A0%87](https://github.com/lidongxuwork126com/ldx_vue/tree/master/Vue%E4%BD%BF%E7%94%A8svg%E5%9B%BE%E6%A0%87))
1. 项目中下载svg加载精灵插件
`$ npm i svg-sprite-loader -save-dev`
2. 在webpack.base.conf.js中`新加入`配置module的rules
~~~
{
test: /\.svg$/,
loader: 'svg-sprite-loader',
include: [resolve('src/icons')],
options: {
symbolId: 'icon-[name]'
}
},
~~~
> 解析src/icons文件夹中的.svg文件
3. 修改module下rules配置, 加入`exclude: [resolve('src/icons')]`
~~~
{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
loader: 'url-loader',
exclude: [resolve('src/icons')],
options: {
limit: 10000,
name: utils.assetsPath('img/[name].[hash:7].[ext]')
}
},
~~~
> 不要让url-loader解析src/icons内的.svg文件, 否则服务器跑不起来
4. 在src下, 新建如下结构
![](https://box.kancloud.cn/8dc767fa500ed0a86948e0e5430edcc8_183x119.png)
(1) svg文件夹下放.svg文件
(2) index.js代码如下:
~~~
import Vue from 'vue'
// 展示svg图标的, svg组件
import SvgIcon from '@/components/SvgIcon'
// 全局注册svg-icon组件
Vue.component('svg-icon', SvgIcon);
// require.context(); 一次性引入
// 1.你要引入文件的目录
// 2.是否要查找该目录下的子级目录
// 3.匹配要引入的文件
const req = require.context('./svg', false, /\.svg$/);
// 加载每个.svg文件到内存中
const requireAll = requireContext => {
// requireContext.keys() 得到数组['./look.svg', './more.svg', './voice.svg']
requireContext.keys().map(requireContext)
};
requireAll(req);
~~~
5. 声明SvgIcon.vue组件, 代码如下
~~~
<!--专门加载字体图标的组件-->
<template>
<!--$listeners是vue2.4新出, 相当于继承父标签的所有事件, .native事件不可用-->
<!--svg标签: 绘制矢量图的 HTML5 标签-->
<svg :class="svgClass" aria-hidden="true" v-on="$listeners">
<!--use标签: 配合svg标签使用, 呈现视图, href指向绘制信息(路径大小等)-->
<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 {
width: 1em;
height: 1em;
vertical-align: -0.15em;
fill: currentColor;
overflow: hidden;
}
</style>
~~~
6. 在main.js注入icons配置
`import "@/icons"`
>[danger]使用
~~~
<svg-icon :iconClass="'voice'"></svg-icon>
~~~
> 使用voice.svg图标
----
扩展: 可以自定义样式, 注意最好给font-size
~~~
<svg-icon :iconClass="'voice'" :className="'voice_class'"></svg-icon>
<style>
.voice_class{
font-size: 5rem;
}
</style>
~~~
>[danger]报错解决
1. 问题: require function is used in a way in which dependencies cannot be statically extracted(require函数不能以静态提取依赖关系)
解决: webpack.base.conf.js中module中加入 `unknownContextCritical : false`
- web前端
- CSS问题
- 布局
- 双飞翼布局_flex方式
- 双飞翼布局_margin方式
- 圣杯布局_flex方式
- 圣杯布局_margin方式
- 子元素居中问题
- 弹性布局
- 概念_
- 标准模式与混杂模式
- 各种FC
- line-height
- vertical-align
- CSS3新特性
- 效果
- div添加箭头
- CSS绘制三角形
- JavaScript
- 兼容
- 事件相关
- 原理
- Ajax原理
- 继承原理
- 原型链继承
- 组合继承
- 寄生组合继承
- 数据绑定
- 1单向数据绑定m到c到v
- 2伪双向数据绑定
- 3双向数据绑定
- socket.io
- 运行时
- this指向
- 0.1+0.2问题
- 对象/数组-深拷贝&浅拷贝
- 事件循环
- typeof
- instanceof
- 概念
- 闭包
- 回调函数
- Promise
- 原生对象
- Attribute和property区别
- 防抖函数
- 节流函数
- 语言类型
- Vue
- Vue优缺点
- 仿Vue源码
- 1数据绑定_Observe
- 2数据绑定_订阅者&观察者定义
- 3数据绑定_Vue类实现
- 4数据绑定_Vue访问data更改
- 5DOM编译_Compile_双大括号模板讲解
- 6DOM编译_v-model讲解
- 7DOM编译_v-on:事件绑定讲解
- 项目总结
- 使用Svg图标
- vueCli环境_真机测试
- vueCli集成环信SDK
- 父子组件双向绑定
- React
- React优缺点
- 我的组件库
- Vue的组件库
- 环信_聊天组件
- 面试题
- HTML_分类
- CSS_分类
- JavaScript_分类
- VueJS_分类
- ReactJS_分类
- AngularJS_分类
- 浏览器端
- 笔试题
- CSS
- 特殊布局
- JavaScript_
- 经典_宏任务_微任务
- 浏览器问题
- CORS
- web服务器
- Apache
- 开启跨域
- Nginx
- 常用命令
- 正向代理
- 反向代理
- 负载均衡
- mac安装Nginx
- 配置80端口
- 算法
- 冒泡排序
- 选择排序
- 合并对象_排序
- 杨辉三角
- 红黑树
- 计算机基础
- 网络相关
- OSI七层模型
- http协议
- http工作原理
- https协议
- GET和POST区别
- hosts文件
- php相关
- session机制
- Linux
- 阿里云服务器
- linux使用Mysql
- 安装mysql
- 导入.sql文件
- 远程连接mysql
- linux使用xampp
- 安装Xampp
- 配置web访问
- 域名绑定服务器
- linux搭建git服务器_apache下
- 代码管理
- 什么是git
- 命令行_使用git
- .gitignore文件讲解
- 软件
- VSCode的安装
- 理财
- 基金
- 摄影