index.taro.vue 3.7 KB

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