index.vue 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. <script setup lang="ts">
  2. import { computed, useAttrs } from 'vue';
  3. import type { SelectProps } from 'naive-ui';
  4. import { useDict } from '@/hooks/business/dict';
  5. import type { disctSelectProps } from '.';
  6. defineOptions({ name: 'DictSelect' });
  7. const props = withDefaults(defineProps<disctSelectProps>(), {
  8. immediate: false,
  9. multiple: false
  10. });
  11. const value = defineModel<string | string[] | null>('value', { required: false });
  12. const attrs: SelectProps = useAttrs();
  13. const { options } = useDict(props.dictCode, props.immediate);
  14. const newOptions = computed(() => {
  15. return options.value
  16. .filter(item => !props.allowedValues || props.allowedValues.includes(item.value))
  17. .map(item => {
  18. return {
  19. label: item.label,
  20. value: item.value,
  21. disabled: Boolean(props.disabledLables?.includes(item.label))
  22. };
  23. });
  24. });
  25. </script>
  26. <template>
  27. <NSelect
  28. v-model:value="value"
  29. :multiple="multiple"
  30. :loading="!options.length"
  31. :options="newOptions"
  32. :clear-filter-after-select="false"
  33. v-bind="attrs"
  34. />
  35. </template>
  36. <style scoped></style>