Swap.vue 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. <template>
  2. <div class="contents">
  3. <div
  4. data-name="inactive"
  5. :class="isActive && 'hidden'"
  6. @click="activate"
  7. @keydown.enter.prevent="activate"
  8. @keydown.space.prevent="activate"
  9. >
  10. <slot name="default" />
  11. <slot
  12. name="inactive"
  13. :activate="activate"
  14. />
  15. </div>
  16. <div
  17. data-name="active"
  18. :class="!isActive && 'hidden'"
  19. @blur="deactivate"
  20. >
  21. <slot name="default" />
  22. <slot
  23. name="active"
  24. :deactivate="deactivate"
  25. />
  26. </div>
  27. </div>
  28. </template>
  29. <script setup>
  30. defineExpose({ activate, deactivate })
  31. const props = defineProps({
  32. active: {
  33. type: Boolean,
  34. default: false
  35. },
  36. disabled: {
  37. type: Boolean,
  38. default: false
  39. }
  40. })
  41. const emit = defineEmits([
  42. "active",
  43. "inactive"
  44. ])
  45. const isActive = ref(!props.disabled && props.active)
  46. function activate() {
  47. if (!props.disabled && !isActive.value) {
  48. // noinspection JSValidateTypes
  49. isActive.value = true
  50. emit("active")
  51. }
  52. }
  53. function deactivate() {
  54. if (isActive.value) {
  55. isActive.value = false
  56. emit("inactive")
  57. }
  58. }
  59. </script>
  60. <style scoped></style>