vue如何動(dòng)態(tài)生成andv圖標(biāo)
vue動(dòng)態(tài)生成andv圖標(biāo)
在最近使用andv的時(shí)候,出現(xiàn)了一個(gè)問(wèn)題,在不使用iconfont圖標(biāo)的前提下使用andv自帶的圖標(biāo)庫(kù)動(dòng)態(tài)生成icon圖標(biāo)。
在百度一下后,發(fā)現(xiàn)以下方法
1.新建一個(gè)createIcon.js文件
import * as icons from '@ant-design/icons-vue';
import { createVNode } from 'vue'
export const CreateIcon = (props)=>{
const {icon} = props;
return createVNode(icons[icon]);
}2.使用
<a-menu
v-model:selectedKeys="state.selectedKeys"
theme="dark"
mode="inline"
>
<template v-for="item in menus" :key="item.path">
<a-sub-menu
v-if="item.children && item.children.length"
key="item.name"
>
<template #icon>
<CreateIcon :icon="item.icon"></CreateIcon>
</template>
<template #title>{{ item.title }}}</template>
<a-menu-item v-for="itemChild in item.children" :key="itemChild.name">
<span>{{ itemChild.title }}</span>
</a-menu-item>
</a-sub-menu>
<a-menu-item v-else>
<template #icon>
<CreateIcon :icon="item.icon"></CreateIcon>
</template>
<span>{{ item.title }}</span>
</a-menu-item>
</template>
</a-menu>import {CreateIcon} from './CreateIcon.js';
import {Component} from 'vue';
interface routerConfig {
path: string;
name: string;
title: string;
icon?:string|Component,
children?:routerConfig[],
}
const menus:routerConfig[] = [
{
path: "/home",
name: "home",
title: "首頁(yè)",
icon: 'HomeOutlined',
children: [],
},
];vue動(dòng)態(tài)綁定圖標(biāo)
圖標(biāo)和圖片的不同
圖標(biāo)時(shí)字符,圖片時(shí)二進(jìn)制流。
即圖片加載會(huì)比圖標(biāo)慢,且加載圖標(biāo)最好不要用img標(biāo)簽,我們可以把圖標(biāo)當(dāng)成組件用 import 的方法引入進(jìn)來(lái),然后當(dāng)成標(biāo)簽引入。
安裝 svg
1.使用管理員身份運(yùn)行cmd窗口,切換到項(xiàng)目目錄下執(zhí)行。
npm add svg
從圖標(biāo)庫(kù)下載圖標(biāo)
1.阿里圖標(biāo)庫(kù)
2.下載svg

3.在compone目錄下建立一個(gè)icons,在icons下建立一個(gè)svg目錄,專門用來(lái)放圖標(biāo)。

查看插件的使用方法
vue所有的插件都在 node_modules
中根據(jù)下載時(shí)的插件名來(lái)找到插件 e-cli-plugin-svg 的 README

展示圖標(biāo)
定義動(dòng)態(tài)組件 MyIcon.vue
1.其中 myicon 是從父組件傳過(guò)來(lái)的屬性
2.computed是用來(lái)根據(jù) myicon.name (圖標(biāo)的名字)來(lái)動(dòng)態(tài)生成圖標(biāo)地址的。原因是在 export default{} 外引入組件時(shí),我們接收到的props屬性是傳遞不到 export default{} 外面的,所以采用computed來(lái)協(xié)助生成 icon 組件。
3.:style 是動(dòng)態(tài)綁定樣式,此處綁定了寬,高。并在props中設(shè)置了默認(rèn)值,如果父組件不傳遞寬高信息的話,就是使用默認(rèn)值。
4.:fill 是綁定填充屬性樣式的,也在 props 中設(shè)置了默認(rèn)值。
<template>
<div>
<component
:is="icon"
:style="{width : myicon.width , hight : myicon.hight}"
:fill="myicon.fill"
></component>
</div>
</template><script>
export default{
props:{
myicon:{
name:{
type:String
},
width:{
type:String,
default:'40px'
},
hight:{
type:String,
default:'40px'
},
fill:{
type:String,
default:'#000000'
}
}
},
computed:{
icon(){
return () => import('@/components/icons/svg/'+ this.myicon.name +'.svg?inline')
}
}
}
</script>
<style>
</style>在main,js中全局引入并定義組件 MyIcon.vue
import mysvg from '@/components/MyIcon.vue'
Vue.component('my-icon',mysvg)調(diào)用 my-icon 作為父組件
1.把要傳遞的屬性定義在 myicon:{} 中,其中 name 是必填項(xiàng),它是圖標(biāo)的名字,不帶后綴。
<template> <my-icon :name = "scope.row.icon" :width = "50px" :hight = "50px" :fill = "#ff00ff"> </my-icon> </template>
<script>
export default {
data() {
return {
myicon:{
name: "position",
width: "60px",
hight: "60px",
fill : "#ff00ff"
},
}
},
}
</script>
<style scoped lang="less">
</style>總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解win7 cmd執(zhí)行vue不是內(nèi)部命令的解決方法
這篇文章主要介紹了詳解win7 cmd執(zhí)行vue不是內(nèi)部命令的解決方法的相關(guān)資料,這里提供了解決問(wèn)題的詳細(xì)步驟,具有一定的參考價(jià)值,需要的朋友可以參考下2017-07-07
vue-pdf插件實(shí)現(xiàn)pdf文檔預(yù)覽方式(自動(dòng)分頁(yè)預(yù)覽)
這篇文章主要介紹了vue-pdf插件實(shí)現(xiàn)pdf文檔預(yù)覽方式(自動(dòng)分頁(yè)預(yù)覽),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
vue登錄路由權(quán)限管理的項(xiàng)目實(shí)踐
在開(kāi)發(fā)Web應(yīng)用程序時(shí),常常需要進(jìn)行登錄驗(yàn)證和權(quán)限管理,本文主要介紹了vue登錄路由權(quán)限管理的項(xiàng)目實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
Element樹(shù)形控件el-tree實(shí)現(xiàn)一鍵全選、反選功能
最近做的項(xiàng)目用到了全選全不選功能,于是就自己動(dòng)手寫(xiě)了一個(gè),這篇文章主要給大家介紹了關(guān)于Element樹(shù)形控件el-tree實(shí)現(xiàn)一鍵全選、反選功能的相關(guān)資料,需要的朋友可以參考下2023-10-10
vue如何在項(xiàng)目中調(diào)用騰訊云的滑動(dòng)驗(yàn)證碼
這篇文章主要介紹了vue如何在項(xiàng)目中調(diào)用騰訊云的滑動(dòng)驗(yàn)證碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
vue.js聲明式渲染和條件與循環(huán)基礎(chǔ)知識(shí)
這篇文章主要為大家詳細(xì)介紹了vue.js聲明式渲染和條件與循環(huán)的基礎(chǔ)知識(shí),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07
使用vue3+vite導(dǎo)入圖片路徑錯(cuò)亂問(wèn)題排查及解決
使用vue3+vite開(kāi)發(fā)的時(shí)候,導(dǎo)入svg圖片時(shí),同一個(gè)文件夾下的文件,其中一個(gè)路徑正常解析,另一個(gè)不行,更改文件名之后,該圖片文件就可以正常解析了,本文給大家介紹了使用vue3+vite導(dǎo)入圖片路徑錯(cuò)亂問(wèn)題排查及解決,需要的朋友可以參考下2024-03-03
vue 將多個(gè)過(guò)濾器封裝到一個(gè)文件中的代碼詳解
這篇文章主要介紹了vue 將多個(gè)過(guò)濾器封裝到一個(gè)文件中實(shí)現(xiàn)方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2020-09-09

