zj-page-layout.vue 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. <template>
  2. <view class="app-container" :class="hasFooter || isTabbar ? '':'pb'"
  3. :style="{background: bgColor, height: 'calc(100vh - ' + aHeight + 'px)'}">
  4. <u-loading-page loading-text="家盛茂工程师" color="#333333" fontSize="17" image="/static/images/logo.png" icon-size="44"
  5. :loading="isLoading">
  6. </u-loading-page>
  7. <block v-if="!isLoading">
  8. <view class="header-container">
  9. <slot name="header"></slot>
  10. </view>
  11. <view class="content-container">
  12. <template v-if="isScroll">
  13. <scroll-view scroll-y enable-flex refresher-enabled style="width: 100%; height: 100%; box-sizing: border-box;"
  14. :refresher-background="refresherBackground" @scrolltoupper="(...p)=>{$emit('scrolltoupper',p)}"
  15. @scrolltolower="(...p)=>{$emit('scrolltolower',p)}" @scroll="(...p)=>{$emit('scroll',p)}"
  16. @refresherpulling="(...p)=>{$emit('refresherpulling',p)}"
  17. @refresherrefresh="(...p)=>{$emit('refresherrefresh',p)}"
  18. @refresherrestore="(...p)=>{$emit('refresherrestore',p)}"
  19. @refresherabort="(...p)=>{$emit('refresherabort',p)}" :refresher-triggered="refresherTriggered">
  20. <slot></slot>
  21. </scroll-view>
  22. </template>
  23. <template v-else>
  24. <view style="width: 100%; height: 100%; box-sizing: border-box; overflow-y: scroll;">
  25. <slot></slot>
  26. </view>
  27. </template>
  28. </view>
  29. <view class="footer-container" v-if="hasFooter">
  30. <slot name="footer"></slot>
  31. </view>
  32. </block>
  33. </view>
  34. </template>
  35. <script>
  36. import {
  37. isWeixin
  38. } from "@/common/utils/common.js"
  39. export default {
  40. props: {
  41. bgColor: {
  42. type: String,
  43. default: '#F3F4F8',
  44. },
  45. refresherBackground: {
  46. type: String,
  47. default: '#FFF',
  48. },
  49. hasFooter: {
  50. type: Boolean,
  51. default: false,
  52. },
  53. isScroll: {
  54. type: Boolean,
  55. default: false,
  56. },
  57. refresherTriggered: {
  58. type: Boolean,
  59. default: false,
  60. },
  61. isLoading: {
  62. type: Boolean,
  63. default: false,
  64. }
  65. },
  66. computed: {
  67. isTabbar() {
  68. let pages = getCurrentPages();
  69. if (pages.length > 0) {
  70. let prevPage = pages[pages.length - 1];
  71. if (prevPage.route === 'pages/index/index' || prevPage.route === 'pages/issue/index' || prevPage.route ===
  72. 'pages/message/index' || prevPage.route === 'pages/mine/index') {
  73. return true;
  74. } else {
  75. return false;
  76. }
  77. }
  78. },
  79. aHeight() {
  80. let num = 0;
  81. // #ifdef H5
  82. if (isWeixin()) {
  83. num = 0;
  84. } else {
  85. if (this.isTabbar) {
  86. num = 50;
  87. } else {
  88. num = 44;
  89. }
  90. }
  91. // #endif
  92. return num;
  93. }
  94. }
  95. }
  96. </script>
  97. <style lang="scss" scoped>
  98. ::v-deep .u-loading-page {
  99. z-index: 999999;
  100. }
  101. .app-container {
  102. width: 100%;
  103. height: 100vh;
  104. box-sizing: border-box;
  105. display: flex;
  106. flex-direction: column;
  107. &.pb {
  108. padding-bottom: env(safe-area-inset-bottom);
  109. }
  110. .header-container {
  111. flex-shrink: 0;
  112. }
  113. .content-container {
  114. flex: 1;
  115. height: 0;
  116. }
  117. .footer-container {
  118. flex-shrink: 0;
  119. padding-bottom: env(safe-area-inset-bottom);
  120. background: #ffffff;
  121. box-sizing: border-box;
  122. box-shadow: $bottom-shadow;
  123. position: relative;
  124. z-index: 1;
  125. }
  126. }
  127. </style>