vue3+vue-cli4中使用svg的方式詳解(親測可用)
技術棧:vue3+vue-cli4
前言:
目前大多數是基於vue2引入,所以想基於vue3需要做一些改動(註意該方法是基於vue-cli中使用的,因為webpack提供瞭require.context(),基於vite構建的項目則不能使用該文章提供的方法)
一、安裝 svg-sprite-loader
npm install svg-sprite-loader --save-dev
二、在src/components/svgIcon下新建組件index.vue
<template> <svg :class="svgClass" aria-hidden="true"> <use :xlink:href="iconName" rel="external nofollow" ></use> </svg> </template> <script> import { computed } from "@vue/reactivity"; export default { name: "baseSvgIcon", props: { iconClass: { type: String }, className: { type: String }, }, setup(props) { const iconName = computed(() => { return props.iconClass ? `#icon-${props.iconClass}` : "#icon"; }); const svgClass = computed(() => { return props.className ? "svg-icon " + props.className : "svg-icon"; }); return { iconName, svgClass }; }, }; </script> <style scoped lang="scss"> .svg-icon { width: 1em; height: 1em; vertical-align: -0.15em; fill: currentColor; overflow: hidden; } </style>
三、在assets在創建icons文件夾
imgs文件夾裡含一個svg文件夾,放svg格式文件,以及一個index.js文件,該文件內容如下
// 獲取當前目錄所有為.svg的文件 const req = require.context('./svg', false, /\.svg$/) // 解析獲取的.svg文件的文件名稱並返回 const requireAll = (requireContext) =>{ return requireContext.keys().map(requireContext) } requireAll(req)
四、在src同級下創建vue.config.js進行配置
經評論區總結,如果是在非vue-cli4的項目中,在config.module.rules.delete("svg");
報錯的話,可以嘗試使用config.module.rule("svg").exclude.add(resolve("src/assets/imgs")).end();
替換該語句
const path = require('path') function resolve(dir) { return path.join(__dirname, '.', dir) } module.exports = { chainWebpack: config => { config.module.rules.delete("svg"); // 重點:刪除默認配置中處理svg, config.module .rule('svg-sprite-loader') .test(/\.svg$/) .include .add(resolve('src/assets/imgs')) // 處理svg目錄 .end() .use('svg-sprite-loader') .loader('svg-sprite-loader') .options({ symbolId: 'icon-[name]' }) }, };
五、在main.js裡引入,以及做一些小修改
此處註意,將組件註冊放到main.js裡。不然會報[Vue warn]: Failed to resolve component: svg-icon的問題,預測為父組件先創建完瞭而子組件還沒創建進去,導致該問題的出現
import { createApp } from 'vue' import App from './App.vue' import router from './router' import store from './store' import '@/assets/icons' const app = createApp(App) import SvgIcon from '@/components/svgIcon' app.component('svg-icon', SvgIcon) app.use(store).use(router).mount('#app')
六、在頁面中使用
<div class="topLeft"> <svg-icon icon-class="category"></svg-icon> </div> <div class="topCenter"></div> <div class="topRight"> <svg-icon icon-class="search"></svg-icon> </div>
七、文件目錄結構及其效果展示
八、參考鏈接地址
1、如果是vue2進行使用的可以參考該文章:https://www.jianshu.com/p/cb67bb4a79f2
2、我看到過的另一種解決思路,將index.js文件裡的內容放入到main.js裡,但我覺得分開層次更清晰,該解決方案在該文章的評論裡:https://zhuanlan.zhihu.com/p/335107384
3、在vite中使用svg的可以參考我另一篇文章:https://www.jb51.net/article/258650.htm
4、評論區裡有人成功瞭,我上傳一版demo放到gitee裡瞭,有問題的地方大傢可以對照看看:https://gitee.com/zasulan/csdn-item/tree/master/vue-music-app,重新上傳瞭一版無node-scss的版本,因為大傢的node版本或者vue-cli版本可能不一致,npm install會報錯因此去除,有需要可自行安裝
總結
到此這篇關於vue3+vue-cli4中使用svg的文章就介紹到這瞭,更多相關vue3+vue-cli4使用svg內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- vue如何封裝自己的Svg圖標組件庫(svg-sprite-loader)
- svgicon組件使用方法示例詳解
- Vue中引入svg圖標的兩種方式
- React優雅的封裝SvgIcon組件示例
- 基於Vue實現自定義組件的方式引入圖標