效果图如下,(下篇文章为:vue3动态路由如何实现,addRoutes失效?)
1.下载图标
# 选择一个你喜欢的包管理器
# NPM
$ npm install @element-plus/icons-vue
# Yarn
$ yarn add @element-plus/icons-vue
# pnpm
$ pnpm install @element-plus/icons-vue
2.引入到vue3项目
import { createApp } from "vue";
import App from "@/App.vue";
import ElementPlus from "element-plus";
import "element-plus/dist/index.css";
import * as ElementPlusIconsVue from "@element-plus/icons-vue";
const app = createApp(App);
app.config.globalProperties.$icons = [];
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
app.config.globalProperties.$icons.push(key);
app.component(key, component);
}
app.use(ElementPlus).mount("#app");
3. 封装图标选择器组件
<script setup lang="ts">
import {
ComponentInternalInstance,
defineEmits,
defineProps,
getCurrentInstance,
} from "vue";
const {
appContext: {
app: {
config: { globalProperties },
},
},
} = getCurrentInstance() as ComponentInternalInstance;
interface Props {
modelValue: string;
}
const props = defineProps<Props>();
const emits = defineEmits(["update:modelValue"]);
/**清空选中的图标 */
function closeIcon() {
emits("update:modelValue", "");
}
</script>
<template>
<el-popover trigger="click" :width="500">
<template #reference>
<el-button class="click-button" :icon="props.modelValue">
{{ props.modelValue }}
<p v-if="!modelValue" class="button-placeholder">点击选择图标</p>
<el-icon @click.stop="closeIcon" v-if="modelValue" class="close-icon"
><CircleClose
/></el-icon>
</el-button>
</template>
<div class="el-icon-picker">
<component
v-for="icon in globalProperties.$icons"
:key="icon"
:class="[icon, 'icon', { 'icon-active': icon == props.modelValue }]"
:is="icon"
@click="emits('update:modelValue', icon)"
>
</component>
</div>
</el-popover>
</template>
<style scoped lang="scss">
.el-icon-picker {
height: 256px;
overflow-y: scroll;
display: flex;
flex-wrap: wrap;
}
.icon {
display: inline-block;
width: 24px;
height: 24px;
color: var(--el-text-color-regular);
font-size: 20px;
border-radius: 4px;
cursor: pointer;
text-align: center;
line-height: 45px;
margin: 5px;
}
.icon:hover {
color: var(--el-color-primary);
}
.icon-active {
color: var(--el-color-primary);
}
.click-button {
width: 100%;
position: relative;
}
::v-deep .el-button {
justify-content: flex-start !important;
}
.button-placeholder {
position: absolute;
display: block;
left: 10px;
top: 50%;
transform: translateY(-50%);
color: #a8abc3;
}
.close-icon {
position: absolute;
right: 10px;
top: 50%;
transform: translateY(-50%);
}
.el-button:focus,
.el-button:hover {
background: #fff;
}
</style>
4.父组件使用方式:
<script setup lang="ts">
import iconSon from "./iconSon.vue";
</script>
<template>
<iconSon v-model="ruleForm.icon"></iconSon>
</template>
5.得到图标值,如何渲染
//如果渲染到列表,那么要进行判断,因为有可能没值,就报错了
<el-icon>
<component v-if="data" :class="[data]" :is="data"> </component>
</el-icon>
6.下篇文章为:vue3动态路由如何实现,addRoutes失效?
vue3动态路由如何实现?点击下方链接到下篇文章(超细)