Select.vue 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. <template>
  2. <el-select ref="input" v-bind="$attrs" :class="[variant]">
  3. <slot />
  4. </el-select>
  5. </template>
  6. <script setup lang="ts">
  7. import { ref } from 'vue'
  8. import type { SelectInstance } from 'element-plus'
  9. const input = ref<SelectInstance>()
  10. withDefaults(
  11. defineProps<{
  12. variant?: 'outlined' | 'borderless' | 'filled' | 'underline'
  13. }>(),
  14. { variant: 'outlined' }
  15. )
  16. defineExpose({
  17. ...(input.value || {}),
  18. focus() {
  19. input.value?.focus()
  20. },
  21. blur() {
  22. input.value?.blur()
  23. }
  24. })
  25. </script>
  26. <style lang="less" scoped>
  27. .borderless {
  28. :deep(.el-select__wrapper) {
  29. box-shadow: none;
  30. &:hover,
  31. &.is-focus {
  32. box-shadow: 0 0 0 1px var(--el-input-focus-border-color) inset;
  33. }
  34. }
  35. }
  36. .underline {
  37. :deep(.el-select__wrapper) {
  38. box-shadow: none;
  39. border-radius: 0;
  40. border-bottom: solid 1px var(--el-input-border-color);
  41. &:hover,
  42. &.is-focus {
  43. border-bottom: solid 1px var(--el-input-focus-border-color);
  44. }
  45. }
  46. }
  47. .filled {
  48. :deep(.el-select__wrapper) {
  49. box-shadow: none;
  50. background-color: #f5f5f5;
  51. &:hover {
  52. background-color: #f0f0f0;
  53. }
  54. &.is-focus {
  55. background-color: transparent;
  56. }
  57. }
  58. }
  59. </style>