index.vue 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. <script setup lang="ts">
  2. import RolePicker from './RolePicker.vue'
  3. import { useCustomFieldValue } from '@vant/use'
  4. const props = withDefaults(
  5. defineProps<{
  6. placeholder?: string
  7. multiple?: boolean
  8. disabled?: boolean
  9. }>(),
  10. {
  11. multiple: false,
  12. disabled: false,
  13. placeholder: '请选择角色'
  14. }
  15. )
  16. const value = defineModel<string | string[] | undefined>({ required: true })
  17. useCustomFieldValue(() => value.value)
  18. const rolePickerRef = ref<InstanceType<typeof RolePicker>>()
  19. const valueArr = computed<string[]>(() => {
  20. if (!value.value) return []
  21. return Array.isArray(value.value) ? value.value : [value.value]
  22. })
  23. const onClose = (roleId: string) => {
  24. if (!value.value) return
  25. if (props.multiple && Array.isArray(value.value)) {
  26. value.value.splice(value.value.indexOf(roleId), 1)
  27. } else {
  28. value.value = undefined
  29. }
  30. }
  31. const openRolePicker = () => {
  32. rolePickerRef.value?.openPopup()
  33. }
  34. </script>
  35. <template>
  36. <div class="flex-items-center flex-wrap gap7px" v-bind="$attrs">
  37. <slot>
  38. <van-button icon="plus" size="mini" class="role-but" @click="openRolePicker" />
  39. </slot>
  40. <RoleTag v-for="item in valueArr" :key="item" :roleId="item" closable @close="onClose(item)" />
  41. <span v-show="!value || value.length === 0" class="placeholder">
  42. {{ placeholder }}
  43. </span>
  44. <RolePicker ref="rolePickerRef" :multiple="multiple" v-bind="$attrs" v-model="value" />
  45. </div>
  46. </template>
  47. <style scoped lang="less">
  48. .role-but {
  49. border-style: dashed;
  50. }
  51. .placeholder {
  52. color: var(--van-text-color);
  53. font-size: var(--van-font-size-md);
  54. }
  55. </style>