>[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下, 新建如下結構

(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的安裝
- 理財
- 基金
- 攝影