svgicon组件新增ele图标

This commit is contained in:
不做码农 2022-04-26 11:24:16 +08:00
parent 6ae27ea49b
commit ba8dca9e47
5 changed files with 61 additions and 29 deletions

View File

@ -1,6 +1,6 @@
<template> <template>
<div class="icon-body"> <div class="icon-body">
<el-input v-model="iconName" style="position: relative;" clearable placeholder="请输入图标名称" @clear="filterIcons" @input="filterIcons"> <el-input v-model="iconName" style="position: relative" clearable placeholder="请输入图标名称" @clear="filterIcons" @input="filterIcons">
<template #prefix> <template #prefix>
<el-icon class="el-input__icon"> <el-icon class="el-input__icon">
<search /> <search />
@ -15,20 +15,32 @@
<el-tabs v-model="activeName"> <el-tabs v-model="activeName">
<el-tab-pane label="svg-icon" name="1"> <el-tab-pane label="svg-icon" name="1">
<div class="icon-list"> <div class="icon-list">
<div v-for="(item, index) in iconList" :key="index" @click="selectedIcon(item)"> <div class="icon-item mb10" v-for="(item, index) in iconList" :key="index" @click="selectedIcon(item)">
<svg-icon :icon-class="item" style="height: 30px;width: 16px;" /> <svg-icon :icon-class="item" style="height: 30px; width: 16px" />
<span>{{ item }}</span> <div class="name">{{ item }}</div>
</div>
</div>
</el-tab-pane>
<el-tab-pane label="Element-UI Icons" name="2">
<div class="icon-list">
<div class="icon-item mb10" v-for="item of elementIcons" :key="item" @click="selectedIcon(item, 'ele-')">
<svg-icon :icon-class="'ele-' + item" style="height: 30px; width: 16px" />
<div class="name">{{ item }}</div>
</div> </div>
</div> </div>
</el-tab-pane> </el-tab-pane>
</el-tabs> </el-tabs>
</div> </div>
</template> </template>
<script setup> <script setup>
import icons from './requireIcons' import icons from './requireIcons'
import * as elIcons from '@element-plus/icons-vue'
const elementIcons = ref([])
for (const key in elIcons) {
elementIcons.value.push(key)
}
const iconName = ref('') const iconName = ref('')
const iconList = ref(icons) const iconList = ref(icons)
const activeName = ref('1') const activeName = ref('1')
@ -41,8 +53,8 @@ function filterIcons() {
} }
} }
function selectedIcon(name) { function selectedIcon(name, prefix) {
emit('selected', name) emit('selected', prefix != undefined ? prefix + name : name)
document.body.click() document.body.click()
} }
@ -56,26 +68,31 @@ defineExpose({
}) })
</script> </script>
<style lang='scss' scoped> <style lang="scss" scoped>
.icon-body { .icon-body {
width: 100%; width: 100%;
padding: 10px; padding: 10px;
.icon-list { .icon-list {
height: 200px;
overflow-y: scroll; overflow-y: scroll;
div { display: flex;
height: 30px; flex-wrap: wrap;
line-height: 30px; justify-content: space-around;
margin-bottom: -5px; height: 200px;
.icon-item {
// height: 30px;
// line-height: 30px;
// margin-bottom: -5px;
cursor: pointer; cursor: pointer;
width: 33%; width: 19%;
float: left; text-align: center;
// float: left;
} }
span { .name {
display: inline-block; // display: inline-block;
vertical-align: -0.15em; // vertical-align: -0.15em;
fill: currentColor; // fill: currentColor;
overflow: hidden; // overflow: hidden;
} }
} }
} }

View File

@ -1,7 +1,8 @@
<template> <template>
<svg :class="svgClass" aria-hidden="true"> <svg :class="svgClass" aria-hidden="true" v-if="iconType == 0">
<use :xlink:href="iconName" :fill="color" /> <use :xlink:href="iconName" :fill="color" />
</svg> </svg>
<el-icon v-else><component :is="iconName" /></el-icon>
</template> </template>
<script> <script>
@ -22,7 +23,20 @@ export default defineComponent({
}, },
setup(props) { setup(props) {
return { return {
iconName: computed(() => `#icon-${props.iconClass}`), iconType: computed(() => {
if (props.iconClass.startsWith('ele')) {
return 1
} else {
return 0
}
}),
iconName: computed(() => {
if (props.iconClass?.startsWith('ele-')) {
return props.iconClass.replace('ele-', '')
} else {
return `#icon-${props.iconClass}`
}
}),
svgClass: computed(() => { svgClass: computed(() => {
if (props.className) { if (props.className) {
return `svg-icon ${props.className}` return `svg-icon ${props.className}`

View File

@ -17,8 +17,7 @@
<span v-if="item.meta && item.meta.title">{{ item.meta.title }}</span> <span v-if="item.meta && item.meta.title">{{ item.meta.title }}</span>
</template> </template>
<sidebar-item v-for="child in item.children" :key="child.path" :is-nest="true" :item="child" :base-path="resolvePath(child.path)" <sidebar-item v-for="child in item.children" :key="child.path" :is-nest="true" :item="child" :base-path="resolvePath(child.path)" class="nest-menu" />
class="nest-menu" />
</el-sub-menu> </el-sub-menu>
</div> </div>
</template> </template>

View File

@ -96,10 +96,12 @@
<ul> <ul>
<li>Vue3</li> <li>Vue3</li>
<li>Vuex</li> <li>Vuex</li>
<li>Element-ui</li> <li>Element plus</li>
<li>Axios</li> <li>Axios</li>
<li>Sass</li> <li>Sass</li>
<li>Quill</li> <li>Wangeditor</li>
<li>Vite</li>
<li>Composition api</li>
<li>...</li> <li>...</li>
</ul> </ul>
</el-col> </el-col>

View File

@ -18,11 +18,11 @@
{{ userInfo.welcomeMessage + ',' + userInfo.nickName + ' ,' + userInfo.welcomeContent }} {{ userInfo.welcomeMessage + ',' + userInfo.nickName + ' ,' + userInfo.welcomeContent }}
</el-col> </el-col>
<el-col :xs="24" :sm="24" :md="24"> <el-col :xs="24" :sm="24" :md="24">
<el-col :xs="24" :md="8" class="right-l-v"> <el-col :xs="24" :lg="8" class="right-l-v">
<div class="right-label">昵称</div> <div class="right-label">昵称</div>
<div class="right-value">{{ userInfo.nickName }}</div> <div class="right-value">{{ userInfo.nickName }}</div>
</el-col> </el-col>
<el-col :xs="24" :md="16" class="right-l-v"> <el-col :xs="24" :lg="16" class="right-l-v">
<div class="right-label">身份</div> <div class="right-label">身份</div>
<div class="right-value"> <div class="right-value">
<span v-for="item in userInfo.roles" :key="item.roleId"> <span v-for="item in userInfo.roles" :key="item.roleId">