index.vue 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. <template>
  2. <nut-popup
  3. :teleport="teleport"
  4. v-model:visible="showPopup"
  5. :close-on-click-overlay="closeOnClickOverlay"
  6. :lock-scroll="lockScroll"
  7. :pop-class="overlayClass"
  8. :style="overlayStyle"
  9. round
  10. @click-overlay="closed"
  11. @click-close-icon="closed"
  12. >
  13. <view :class="classes">
  14. <view v-if="title" class="nut-dialog__header">
  15. <slot v-if="$slots.header" name="header"></slot>
  16. <template v-else>{{ title }}</template>
  17. </view>
  18. <view class="nut-dialog__content" :style="{ textAlign }">
  19. <slot v-if="$slots.default" name="default"></slot>
  20. <view v-else-if="typeof content === 'string'" v-html="content"></view>
  21. <component v-else :is="content" />
  22. </view>
  23. <view class="nut-dialog__footer" :class="{ [footerDirection]: footerDirection }" v-if="!noFooter">
  24. <slot v-if="$slots.footer" name="footer"></slot>
  25. <template v-else>
  26. <nut-button
  27. size="small"
  28. plain
  29. type="primary"
  30. class="nut-dialog__footer-cancel"
  31. v-if="!noCancelBtn"
  32. @click="onCancel"
  33. >
  34. {{ cancelText || translate('cancel') }}
  35. </nut-button>
  36. <nut-button v-if="!noOkBtn" size="small" type="primary" class="nut-dialog__footer-ok" @click="onOk">
  37. {{ okText || translate('confirm') }}
  38. </nut-button>
  39. </template>
  40. </view>
  41. </view>
  42. </nut-popup>
  43. </template>
  44. <script lang="ts">
  45. import { onMounted, computed, watch, ref, PropType, VNode } from 'vue';
  46. import { createComponent } from '@/packages/utils/create';
  47. const { componentName, create, translate } = createComponent('dialog');
  48. import Popup, { popupProps } from '../popup/index.vue';
  49. import Button from '../button/index.vue';
  50. export default create({
  51. inheritAttrs: false,
  52. components: {
  53. [Popup.name]: Popup,
  54. [Button.name]: Button
  55. },
  56. props: {
  57. ...popupProps,
  58. closeOnClickOverlay: {
  59. type: Boolean,
  60. default: false
  61. },
  62. title: {
  63. type: String,
  64. default: ''
  65. },
  66. content: {
  67. type: [String, Object] as PropType<string | VNode>,
  68. default: ''
  69. },
  70. noFooter: {
  71. type: Boolean,
  72. default: false
  73. },
  74. noOkBtn: {
  75. type: Boolean,
  76. default: false
  77. },
  78. noCancelBtn: {
  79. type: Boolean,
  80. default: false
  81. },
  82. cancelText: {
  83. type: String,
  84. default: ''
  85. },
  86. okText: {
  87. type: String,
  88. default: ''
  89. },
  90. cancelAutoClose: {
  91. type: Boolean,
  92. default: true
  93. },
  94. textAlign: {
  95. type: String,
  96. default: 'center'
  97. },
  98. closeOnPopstate: {
  99. type: Boolean,
  100. default: false
  101. },
  102. footerDirection: {
  103. type: String,
  104. default: 'horizontal' //vertical
  105. }
  106. },
  107. emits: ['update', 'update:visible', 'ok', 'cancel', 'open', 'opened', 'close', 'closed'],
  108. setup(props, { emit }) {
  109. const showPopup = ref(props.visible);
  110. onMounted(() => {
  111. if (props.closeOnPopstate) {
  112. window.addEventListener('popstate', function () {
  113. closed();
  114. });
  115. }
  116. });
  117. watch(
  118. () => props.visible,
  119. (value) => {
  120. showPopup.value = value;
  121. }
  122. );
  123. const classes = computed(() => {
  124. return {
  125. [componentName]: true
  126. };
  127. });
  128. const update = (val: boolean) => {
  129. emit('update', val);
  130. emit('update:visible', val);
  131. };
  132. const closed = () => {
  133. update(false);
  134. emit('closed');
  135. };
  136. const onCancel = () => {
  137. emit('cancel');
  138. if (props.cancelAutoClose) {
  139. closed();
  140. }
  141. };
  142. const onOk = () => {
  143. emit('ok');
  144. closed();
  145. };
  146. return {
  147. closed,
  148. classes,
  149. onCancel,
  150. onOk,
  151. showPopup,
  152. translate
  153. };
  154. }
  155. });
  156. </script>