VDialog.vue 735 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. <template>
  2. <dialog ref="dialog" class="v-dialog" v-bind="attrs" >
  3. <slot />
  4. </dialog>
  5. </template>
  6. <script setup lang="ts">
  7. import {
  8. onMounted, ref, watchEffect, useAttrs,
  9. } from 'vue';
  10. const dialog = ref<InstanceType<any> | undefined>(null);
  11. const internalOpen = ref(false);
  12. const props = defineProps({
  13. open: Boolean,
  14. });
  15. const attrs = useAttrs();
  16. function showHideDialog() {
  17. if (!dialog?.value) return;
  18. if (props.open) dialog.value.showModal();
  19. else dialog.value.close();
  20. }
  21. onMounted(() => {
  22. watchEffect(() => {
  23. if (props.open !== internalOpen.value) {
  24. showHideDialog();
  25. internalOpen.value = props.open;
  26. }
  27. });
  28. });
  29. </script>
  30. <style></style>