u-empty.vue 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. <template>
  2. <view class="u-empty" :style="[emptyStyle]" v-if="show">
  3. <view class="icon" v-if="!isSrc" :name="mode === 'message' ? 'chat' : `empty-${mode}`" :size="iconSize" :color="iconColor" margin-top="14"></view>
  4. <image
  5. :style="{
  6. width: $u.addUnit(width),
  7. height: $u.addUnit(height)
  8. }"
  9. src="../../../static/empty.png"
  10. mode="widthFix"
  11. ></image>
  12. <text class="u-empty__text" :style="[textStyle]">{{ text ? text : icons[mode] }}</text>
  13. <view class="u-empty__wrap" v-if="$slots.default || $slots.$default"><slot /></view>
  14. </view>
  15. </template>
  16. <script>
  17. import props from './props.js';
  18. /**
  19. * empty 内容为空
  20. * @description 该组件用于需要加载内容,但是加载的第一页数据就为空,提示一个"没有内容"的场景, 我们精心挑选了十几个场景的图标,方便您使用。
  21. * @tutorial https://www.uviewui.com/components/empty.html
  22. * @property {String} icon 内置图标名称,或图片路径,建议绝对路径
  23. * @property {String} text 提示文字
  24. * @property {String} textColor 文字颜色 (默认 '#c0c4cc' )
  25. * @property {String | Number} textSize 文字大小 (默认 14 )
  26. * @property {String} iconColor 图标的颜色 (默认 '#c0c4cc' )
  27. * @property {String | Number} iconSize 图标的大小 (默认 90 )
  28. * @property {String} mode 选择预置的图标类型 (默认 'data' )
  29. * @property {String | Number} width 图标宽度,单位px (默认 160 )
  30. * @property {String | Number} height 图标高度,单位px (默认 160 )
  31. * @property {Boolean} show 是否显示组件 (默认 true )
  32. * @property {String | Number} marginTop 组件距离上一个元素之间的距离,默认px单位 (默认 0 )
  33. * @property {Object} customStyle 定义需要用到的外部样式
  34. *
  35. * @event {Function} click 点击组件时触发
  36. * @event {Function} close 点击关闭按钮时触发
  37. * @example <u-empty text="所谓伊人,在水一方" mode="list"></u-empty>
  38. */
  39. export default {
  40. name: 'u-empty',
  41. mixins: [uni.$u.mpMixin, uni.$u.mixin, props],
  42. data() {
  43. return {
  44. icons: {
  45. car: '购物车为空',
  46. data: '数据为空',
  47. comment: '暂无评论'
  48. }
  49. };
  50. },
  51. computed: {
  52. // 组件样式
  53. emptyStyle() {
  54. const style = {};
  55. style.marginTop = uni.$u.addUnit(this.marginTop);
  56. // 合并customStyle样式,此参数通过mixin中的props传递
  57. return uni.$u.deepMerge(uni.$u.addStyle(this.customStyle), style);
  58. },
  59. // 文本样式
  60. textStyle() {
  61. const style = {};
  62. style.color = this.textColor;
  63. style.fontSize = uni.$u.addUnit(this.textSize);
  64. return style;
  65. },
  66. // 判断icon是否图片路径
  67. isSrc() {
  68. return this.icon.indexOf('/') >= 0;
  69. }
  70. }
  71. };
  72. </script>
  73. <style lang="scss" scoped>
  74. @import '../../libs/css/components.scss';
  75. $u-empty-text-margin-top: 20rpx !default;
  76. $u-empty-slot-margin-top: 20rpx !default;
  77. .u-empty {
  78. @include flex;
  79. flex-direction: column;
  80. justify-content: center;
  81. align-items: center;
  82. &__text {
  83. @include flex;
  84. justify-content: center;
  85. align-items: center;
  86. margin-top: -10px;
  87. }
  88. }
  89. .u-slot-wrap {
  90. @include flex;
  91. justify-content: center;
  92. align-items: center;
  93. margin-top: $u-empty-slot-margin-top;
  94. }
  95. </style>