mescroll-empty.vue 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. <!--空布局:
  2. 遵循easycom规范, 可作为独立的组件, 不使用mescroll的页面也能使用:
  3. <mescroll-empty v-if="isShowEmpty" :option="optEmpty" @emptyclick="emptyClick"></mescroll-empty>
  4. -->
  5. <template>
  6. <view class="mescroll-empty" :class="{ 'empty-fixed': option.fixed }"
  7. :style="{ 'z-index': option.zIndex, top: option.top }">
  8. <view>
  9. <image v-if="icon" class="empty-icon" :src="icon" mode="widthFix" />
  10. </view>
  11. <view v-if="tip" class="empty-tip">{{ tip }}</view>
  12. <view v-if="btnText" class="empty-btn" @click="emptyClick">{{ btnText }}</view>
  13. </view>
  14. </template>
  15. <script>
  16. // 引入全局配置
  17. import GlobalOption from '../mescroll-uni/mescroll-uni-option.js';
  18. // 引入国际化工具类
  19. import mescrollI18n from '../mescroll-uni/mescroll-i18n.js';
  20. export default {
  21. props: {
  22. // empty的配置项: 默认为GlobalOption.up.empty
  23. option: {
  24. type: Object,
  25. default () {
  26. return {};
  27. }
  28. }
  29. },
  30. // 使用computed获取配置,用于支持option的动态配置
  31. computed: {
  32. // 图标
  33. icon() {
  34. if (this.option.icon != null) { // 此处不使用短路求值, 用于支持传空串不显示图标
  35. return this.option.icon
  36. } else {
  37. let i18nType = mescrollI18n.getType() // 国际化配置
  38. if (this.option.i18n) {
  39. return this.option.i18n[i18nType].icon
  40. } else {
  41. return GlobalOption.i18n[i18nType].up.empty.icon || GlobalOption.up.empty.icon
  42. }
  43. }
  44. },
  45. // 文本提示
  46. tip() {
  47. if (this.option.tip != null) { // 支持传空串不显示文本提示
  48. return this.option.tip
  49. } else {
  50. let i18nType = mescrollI18n.getType() // 国际化配置
  51. if (this.option.i18n) {
  52. return this.option.i18n[i18nType].tip
  53. } else {
  54. return GlobalOption.i18n[i18nType].up.empty.tip || GlobalOption.up.empty.tip
  55. }
  56. }
  57. },
  58. // 按钮文本
  59. btnText() {
  60. if (this.option.i18n) {
  61. let i18nType = mescrollI18n.getType() // 国际化配置
  62. return this.option.i18n[i18nType].btnText
  63. } else {
  64. return this.option.btnText
  65. }
  66. }
  67. },
  68. methods: {
  69. // 点击按钮
  70. emptyClick() {
  71. this.$emit('emptyclick');
  72. }
  73. }
  74. };
  75. </script>
  76. <style>
  77. /* 无任何数据的空布局 */
  78. .mescroll-empty {
  79. box-sizing: border-box;
  80. width: 100%;
  81. padding: 100rpx 50rpx;
  82. text-align: center;
  83. }
  84. .mescroll-empty.empty-fixed {
  85. z-index: 99;
  86. position: absolute;
  87. /*transform会使fixed失效,最终会降级为absolute */
  88. top: 100rpx;
  89. left: 0;
  90. }
  91. .mescroll-empty .empty-icon {
  92. width: 496rpx;
  93. height: 308rpx;
  94. }
  95. .mescroll-empty .empty-tip {
  96. margin-top: 20rpx;
  97. font-size: 26rpx;
  98. color: #333;
  99. }
  100. .mescroll-empty .empty-btn {
  101. display: inline-block;
  102. margin-top: 40rpx;
  103. min-width: 200rpx;
  104. padding: 18rpx;
  105. font-size: 28rpx;
  106. border: 1rpx solid #e04b28;
  107. border-radius: 60rpx;
  108. color: #e04b28;
  109. }
  110. .mescroll-empty .empty-btn:active {
  111. opacity: 0.75;
  112. }
  113. </style>