12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- <template>
- <t-select
- v-model="selected"
- filterable
- clearable
- v-bind="attrs"
- @change="onChange"
- >
- <t-option
- v-for="item in optionList"
- :key="item.id"
- :value="item.id"
- :label="item.name"
- />
- </t-select>
- </template>
- <script setup name="SelectSupplier">
- import { onMounted, ref, useAttrs, watch, computed } from 'vue';
- import { getAllRoleList } from '@/api/user';
- let optionList = ref([]);
- let selected = ref('');
- const attrs = useAttrs();
- const emit = defineEmits(['update:modelValue', 'change']);
- const props = defineProps({
- modelValue: { type: [Number, String, Array], default: '' },
- });
- const isMultiple = computed(() => {
- const multiple = attrs.multiple;
- return multiple === '' || multiple;
- });
- const search = async () => {
- optionList.value = [];
- const res = await getAllRoleList().catch(() => {});
- if (!res) return;
- optionList.value = res;
- };
- const onChange = () => {
- const selectedData = isMultiple.value
- ? optionList.value.filter(
- (item) => selected.value && selected.value.includes(item.id)
- )
- : optionList.value.filter((item) => selected.value === item.id);
- emit('update:modelValue', selected.value);
- emit('change', isMultiple.value ? selectedData : selectedData[0]);
- };
- onMounted(() => {
- search();
- });
- watch(
- () => props.modelValue,
- (val) => {
- selected.value = val;
- },
- {
- immediate: true,
- }
- );
- </script>
|