在vue项⽬中优雅的使⽤SVG的⽅法实例详解
1、基础介绍
本⽂旨在介绍如何在项⽬中配置和⽅便的使⽤svg图标。
本⽂以vue项⽬为例,当然在react中的使⽤原理基本相似。
svg图标可以直接通过img标签来使⽤,也可当做icon来使⽤。
本⽂是参考了鑫旭⼤佬的⽂章:SVG Sprite技术介绍。
2、配置
安装svg-sprite-loader。通过vue-cli脚⼿架创建的项⽬默认情况下会使⽤ url-loader 对svg进⾏处理,所以需要处理下:
{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,
name: utils.assetsPath('img/[name].[hash:7].[ext]')
}
}
cnpm i -D svg-sprite-loader。在static下新建svg⽂件夹,⽤来放置当做icon使⽤的svg,使⽤include,include和img做区分。然后修改f.js配置,这样svg-sprite-loader只会处理我们指定的static/svg下的⽂件:
{
test: /\.svg$/,
loader: 'svg-sprite-loader',
include: [resolve('static/svg')], // include => 只处理指定的⽂件夹下的⽂件
options: {
symbolId: 'icon-[name]'
svg文件怎么生成
}
},
{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
loader: 'url-loader',
exclude: [resolve('static/svg')], // exclude => 不处理指定的⽂件夹下的⽂件
options: {
limit: 10000,
name: utils.assetsPath('img/[name].[hash:7].[ext]')
}
}
3、使⽤
在components下创建svg⽂件夹,创建Svg.vue⽂件:
<svg :class="svgClass" aria-hidden="true">
<use :xlink:href="iconName" rel="external nofollow" ></use>
</svg>
在utils⽂件夹下创建svgConfig⽂件夹,创建index.js⽂件,全局注册svg-icon组件。
Vueponent('svg-icon', SvgIcon)
使⽤t⾃动导⼊⽂件,⽽不需要import⼀个个去引⽤:
const requireAll = requireContext => requireContext.keys().map(requireContext)
const req = t('./../../../static/svg/', true, /\.svg$/)
requireAll(req)
4. 在main.js在执⾏:
import '@/utils/svgConfig'
到此我们就可以直接在项⽬中使⽤:
<svg-icon icon-class="users" />
4、优化
虽然现在已经可以使⽤svg-icon,当是还⽆法直观的分辨svg,当svg⽂件⽐较多的时候,如果只能⼀个个的去查将费时费⼒。为⽅便我们查和使⽤svg,可以新建⼀个svg的列表页。
在pages⽂件下新建SvgList.vue⽂件,iconsMap为导⼊的svg⽂件数组,handleClipboard⽅法为点击复制的⽅法,通过安装clipboard实现(cnpm i -S clipboard):
<div class="icons-wrapper">
<div v-for="item in iconsMap" :key="item" @click="handleClipboard(generateIconCode(item), $event)">
<el-tooltip placement="top">
<div slot="content">
{{generateIconCode(item)}}
</div>
<div class="icon-item">
<div>
<span class="svg-wrap" @click.stop>
<svg-icon :icon-class="item" />
</span>
</div>
<span>{{item}}</span>
</div>
</el-tooltip>
</div>
</div>
获取iconsMap,在utils⽂件夹下创建svgConfig⽂件夹,generateIconsView.js⽂件,当然如果你使⽤了vuex,也可以保存在vuex中的state中:
const data = {
state: {
iconsMap: []
},
generate (iconsMap) {
this.state.iconsMap = iconsMap
}
}
export default data
将数据保存在iconsMap中:
在SvgList.vue中使⽤:
<script>
import icons from '@/utils/svgConfig/generateIconsView'
export default {
name: 'icons',
data () {
return {
iconsMap: []
}
},
mounted () {
const iconsMap = icons.state.iconsMap.map((i) => {
return i.default.id.split('-')[1]
})
this.iconsMap = iconsMap
}
}
</script>
添加点击复制的提⽰和⽅法(cnpm i -S clipboard),在SvgList.vue中使⽤:
methods: {
generateIconCode (symbol) {
return `<svg-icon icon-class="${symbol}" />`
},
handleClipboard (text, event) {
clipboard(text, event)
}
}
在路由添加SvgList.vue的路由信息,页⾯效果如下:
总结
以上所述是⼩编给⼤家介绍的在vue项⽬中优雅的使⽤SVG的⽅法实例详解,希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。在此也⾮常感谢⼤家对⽹站的⽀持!