dialog-base.vue 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. <template>
  2. <view v-if="visible" class="dialog-container uni-column">
  3. <view class="bg"></view>
  4. <view class="dialog-body">
  5. <view class="close-btn uni-column" @click="close">
  6. <image class="close-btn-icon" src="../../static/images/login-dialog-close-icon.png" mode="widthFix" />
  7. </view>
  8. <view class="dialog-title">
  9. <text class="label">{{props.title}}</text>
  10. </view>
  11. <slot></slot>
  12. <slot name='footer'></slot>
  13. </view>
  14. </view>
  15. </template>
  16. <script setup>
  17. import { ref } from 'vue'
  18. const visible = ref(false)
  19. const props = defineProps({
  20. title: {
  21. type: String,
  22. default: '对话框'
  23. }
  24. })
  25. const open = () => {
  26. visible.value = true
  27. }
  28. const close = () => {
  29. visible.value = false
  30. }
  31. /** 暴露给父组件的方法 */
  32. defineExpose({
  33. open,
  34. close
  35. })
  36. </script>
  37. <style lang="scss">
  38. .dialog-container {
  39. position: fixed;
  40. top: 0;
  41. right: 0;
  42. bottom: 0;
  43. left: 0;
  44. z-index: 1000;
  45. .bg {
  46. position: absolute;
  47. top: 0;
  48. right: 0;
  49. bottom: 0;
  50. left: 0;
  51. background-color: #333333;
  52. opacity: 0.3;
  53. z-index: 1001;
  54. }
  55. .dialog-body {
  56. position: absolute;
  57. top: 200rpx;
  58. right: 64rpx;
  59. left: 64rpx;
  60. padding: 0 48rpx 48rpx 48rpx;
  61. background-color: #FFFFFF;
  62. z-index: 1002;
  63. .close-btn {
  64. position: absolute;
  65. right: 24rpx;
  66. top: 24rpx;
  67. width: 40rpx;
  68. height: 40rpx;
  69. z-index: 1003;
  70. .close-btn-icon {
  71. width: 40rpx;
  72. }
  73. }
  74. .dialog-title {
  75. align-items: center;
  76. margin-top: 40rpx;
  77. .label {
  78. font-weight: bold;
  79. font-size: 40rpx;
  80. }
  81. }
  82. }
  83. }
  84. </style>