el-select 添加icon

发布于:2025-02-21 ⋅ 阅读:(25) ⋅ 点赞:(0)

Element-ui-plus 新版本:Select 选择器 | Element Plus

要实现如上的效果 ,要用到具名插槽 prefix,看代码:

<template>
    <el-dialog ref="dialogRef" v-model="dialogVisible" :title="title" :width="dialogWidth" :before-close="handleClose" :close-on-click-modal="closeModal" :append-to-body="appendToBody" :class="['resizable-dialog', { 'is-dragging': isDragging }]" draggable>
        <template #header>
            <div class="dialog-header flex flex-col justify-center items-center">
                <div class="dialog-title font-bold text-gray-100">Transfer Crypto</div>
                <div class="text-gray-500"> Balence: $33.96</div>
            </div>
        </template>
        <el-form label-position="top">
            <el-form-item label="TOKEN">
                <el-select v-model="voData.form.chain" placeholder="Select Chain">
                    <el-option v-for="item in voState.chainOptions" :key="item.value" :label="item.label" :value="item.value">
                        <div class="flex items-center gap-1">
                            <svg-icon class="w-3 h-3 ml-2" :name="item.icon" />
                            <span :style="{ color: item.value }">{{ item.label }}</span>
                        </div>
                    </el-option>
                    <template #prefix>
                        <svg-icon class="w-3 h-3 ml-2" :name="selectedIcon"></svg-icon>
                    </template>
                </el-select>
            </el-form-item>

        </el-form>
    </el-dialog>

</template>
    
    <script setup lang="ts">
import { ref, reactive, computed, onMounted, onUnmounted } from "vue";
import SvgIcon from "../SvgIcon/SvgIcon.vue";

// 定义 props
const props = defineProps({
    title: {
        type: String,
        default: "标题",
    },
    visible: {
        type: Boolean,
        default: false,
    },
    closeModal: {
        type: Boolean,
        default: false,
    },
    appendToBody: {
        type: Boolean,
        default: true,
    },
});

// 定义 emits
const emit = defineEmits([
    "update:visible",
    "close",
    "cancel",
    "confirm",
    "save",
]);

// 弹窗显示状态
const dialogVisible = computed({
    get: () => props.visible,
    set: (val) => emit("update:visible", val),
});

// 弹窗宽度
const dialogWidth = ref("380px");

const dialogRef = ref(null); // ref 引用

const voState = reactive({
    chainOptions: [
        {
            label: "USDC",
            value: "USDC",
            icon: "usdc",
        },
        {
            label: "DAI",
            value: "DAI",
            icon: "dai",
        },
        {
            label: "ETH",
            value: "ETH",
            icon: "eth",
        },
        { label: "USDC.e", value: "USDC.e", icon: "usdc" },
        { label: "USDT", value: "USDT", icon: "usdt" },
        { label: "POL", value: "POL", icon: "pol" },
        { label: "WETH", value: "WETH", icon: "weth" },
    ],
});

const voData = reactive({
    form: {
        chain: "",
    },
});

// 根据选中的值动态计算图标
const selectedIcon = computed(() => {
  const selectedOption = voState.chainOptions.find(option => option.value === voData.form.chain);
  return selectedOption ? selectedOption.icon : null;
});

// 关闭弹窗
const close = () => {
    emit("close");
    dialogVisible.value = false;
};

// 取消
const cancel = () => {
    emit("cancel");
    dialogVisible.value = false;
};

// 确认
const confirm = () => {
    emit("confirm");
};

// 保存
const save = () => {
    emit("save");
};

// 处理关闭事件
const handleClose = () => {
    emit("cancel");
    dialogVisible.value = false;
};

// 监听窗口大小变化
onMounted(() => {});

// 移除监听器
onUnmounted(() => {});
</script>
    
    <style lang="scss" scoped>
</style>


网站公告

今日签到

点亮在社区的每一天
去签到