smart-admin/smart-admin-web-javascript/src/components/support/dict-select/index.vue

104 lines
2.7 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!---
* 字段 下拉选择框
*
* @Author: 1024创新实验室罗伊
* @Date: 2022-09-12 22:06:45
* @Wechat: zhuda1024
* @Email: lab1024@163.com
* @Copyright 1024创新实验室 https://1024lab.net Since 2012
*
-->
<template>
<div>
<a-select
v-model:value="selectValue"
:style="`width: ${width}`"
:placeholder="props.placeholder"
:allowClear="true"
:size="size"
:mode="mode"
@change="onChange"
:disabled="disabled"
>
<a-select-option v-for="item in dictDataList" :key="item.dataValue" :value="item.dataValue" :disabled="disabledOption.includes(item.valueCode)">
{{ item.dataLabel }}
</a-select-option>
</a-select>
</div>
</template>
<script setup>
import { onMounted, ref, watch } from 'vue';
import { useDictStore } from '/@/store/modules/system/dict.js';
const props = defineProps({
dictCode: String,
value: [Array, String, Number],
mode: {
type: String,
default: 'combobox',
},
width: {
type: String,
default: '200px',
},
placeholder: {
type: String,
default: '请选择',
},
size: {
type: String,
default: 'default',
},
// 禁用整个下拉选择框
disabled: {
type: Boolean,
default: false,
},
// 需要禁用的选项字典值编码
disabledOption: {
type: Array,
default: () => [],
},
// 需要隐藏的选项字典值编码
hiddenOption: {
type: Array,
default: () => [],
},
});
// -------------------------- 查询 字典数据 --------------------------
const dictDataList = ref([]);
function initDictData() {
let list = useDictStore().getDictData(props.dictCode);
dictDataList.value = list.filter((item) => !props.hiddenOption.includes(item.dataValue) && !item.disabledFlag);
}
onMounted(initDictData);
// -------------------------- 选中 相关、事件 --------------------------
const selectValue = ref(props.value);
watch(
() => props.value,
(newValue) => {
// 如果传入的值是被禁用或被隐藏的选项,则移除这些选项
if (Array.isArray(newValue)) {
selectValue.value = newValue.filter((item) => !props.disabledOption.includes(item) && !props.hiddenOption.includes(item));
} else {
selectValue.value = props.hiddenOption.includes(newValue) || props.disabledOption.includes(newValue) ? undefined : newValue;
}
},
{ immediate: true }
);
const emit = defineEmits(['update:value', 'change']);
function onChange(value) {
emit('update:value', value);
emit('change', value);
}
</script>