Files
ruoyi-plus-vben5/apps/web-antd/src/components/Dict/src/index.vue
2024-09-09 16:56:25 +08:00

52 lines
1.4 KiB
Vue

<script setup lang="ts">
import type { DictData } from '#/api/system/dict/dict-data-model';
import { computed } from 'vue';
import { Tag } from 'ant-design-vue';
import { tagTypes } from './data';
interface Props {
dicts: DictData[]; // dict数组
value: number | string; // value
}
const props = withDefaults(defineProps<Props>(), {
dicts: undefined,
});
const color = computed<string>(() => {
// eslint-disable-next-line eqeqeq
const current = props.dicts.find((item) => item.dictValue == props.value);
const listClass = current?.listClass ?? '';
// 是否为默认的颜色
const isDefault = Reflect.has(tagTypes, listClass);
// 判断是默认还是自定义颜色
if (isDefault) {
// 这里做了antd - element-plus的兼容
return tagTypes[listClass]!.color;
}
return listClass;
});
const cssClass = computed<string>(() => {
// eslint-disable-next-line eqeqeq
const current = props.dicts.find((item) => item.dictValue == props.value);
return current?.cssClass ?? '';
});
const label = computed<number | string>(() => {
// eslint-disable-next-line eqeqeq
const current = props.dicts.find((item) => item.dictValue == props.value);
return current?.dictLabel ?? 'unknown';
});
</script>
<template>
<div>
<Tag v-if="color" :class="cssClass" :color="color">{{ label }}</Tag>
<div v-if="!color" :class="cssClass">{{ label }}</div>
</div>
</template>