191 lines
4.1 KiB
Vue
191 lines
4.1 KiB
Vue
|
<template>
|
|||
|
<view v-if="show" class="tn-empty-class tn-empty" :style="[emptyStyle]">
|
|||
|
<view
|
|||
|
v-if="!isImage"
|
|||
|
class="tn-empty__icon"
|
|||
|
:class="[icon ? `tn-icon-${icon}` : `tn-icon-empty-${mode}`]"
|
|||
|
:style="[iconStyle]"
|
|||
|
></view>
|
|||
|
<image
|
|||
|
v-else
|
|||
|
class="tn-empty__image"
|
|||
|
:style="[imageStyle]"
|
|||
|
:src="icon"
|
|||
|
mode="widthFix"
|
|||
|
></image>
|
|||
|
|
|||
|
<view
|
|||
|
class="tn-empty__text"
|
|||
|
:style="[textStyle]"
|
|||
|
>{{ text ? text : icons[mode]}}</view>
|
|||
|
<view v-if="$slots.default || $slots.$default" class="tn-empty__slot">
|
|||
|
<slot/>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
</template>
|
|||
|
|
|||
|
<script>
|
|||
|
export default {
|
|||
|
name: 'tn-empty',
|
|||
|
props: {
|
|||
|
// 显示空白页
|
|||
|
show: {
|
|||
|
type: Boolean,
|
|||
|
default: true
|
|||
|
},
|
|||
|
// 内置icon的名称
|
|||
|
// 图片路径,建议使用绝对路径
|
|||
|
icon: {
|
|||
|
type: String,
|
|||
|
default: ''
|
|||
|
},
|
|||
|
// 预置图标类型
|
|||
|
mode: {
|
|||
|
type: String,
|
|||
|
default: 'data'
|
|||
|
},
|
|||
|
// 提示文字
|
|||
|
text: {
|
|||
|
type: String,
|
|||
|
default: ''
|
|||
|
},
|
|||
|
// 文字颜色
|
|||
|
textColor: {
|
|||
|
type: String,
|
|||
|
default: ''
|
|||
|
},
|
|||
|
// 文字大小,单位rpx
|
|||
|
textSize: {
|
|||
|
type: Number,
|
|||
|
default: 0
|
|||
|
},
|
|||
|
// 图标颜色
|
|||
|
iconColor: {
|
|||
|
type: String,
|
|||
|
default: ''
|
|||
|
},
|
|||
|
// 图标大小,单位rpx
|
|||
|
iconSize: {
|
|||
|
type: Number,
|
|||
|
default: 0
|
|||
|
},
|
|||
|
// 图片宽度(当图标为图片时生效),单位rpx
|
|||
|
imgWidth: {
|
|||
|
type: Number,
|
|||
|
default: 0
|
|||
|
},
|
|||
|
// 图片高度(当图标为图片时生效),单位rpx
|
|||
|
imgHeight: {
|
|||
|
type: Number,
|
|||
|
default: 0
|
|||
|
},
|
|||
|
// 自定义组件样式
|
|||
|
customStyle: {
|
|||
|
type: Object,
|
|||
|
default() {
|
|||
|
return {}
|
|||
|
}
|
|||
|
}
|
|||
|
},
|
|||
|
computed: {
|
|||
|
emptyStyle() {
|
|||
|
let style = {}
|
|||
|
Object.assign(style, this.customStyle)
|
|||
|
return style
|
|||
|
},
|
|||
|
iconStyle() {
|
|||
|
let style = {}
|
|||
|
if (this.iconSize) {
|
|||
|
style.fontSize = this.iconSize + 'rpx'
|
|||
|
}
|
|||
|
if (this.iconColor) {
|
|||
|
style.color = this.iconColor
|
|||
|
}
|
|||
|
return style
|
|||
|
},
|
|||
|
imageStyle() {
|
|||
|
let style = {}
|
|||
|
if (this.imgWidth) {
|
|||
|
style.width = this.imgWidth + 'rpx'
|
|||
|
}
|
|||
|
if (this.imgHeight) {
|
|||
|
style.height = this.imgHeight + 'rpx'
|
|||
|
}
|
|||
|
return style
|
|||
|
},
|
|||
|
textStyle() {
|
|||
|
let style = {}
|
|||
|
if (this.textColor) {
|
|||
|
style.color = this.textColor
|
|||
|
}
|
|||
|
if (this.textSize) {
|
|||
|
style.fontSize = this.textSize + 'rpx'
|
|||
|
}
|
|||
|
return style
|
|||
|
},
|
|||
|
// 判断传递的icon是否为图片
|
|||
|
isImage() {
|
|||
|
return this.icon.indexOf('/') >= 0
|
|||
|
}
|
|||
|
},
|
|||
|
data() {
|
|||
|
return {
|
|||
|
icons: {
|
|||
|
cart: '购物车为空',
|
|||
|
page: '页面不存在',
|
|||
|
search: '搜索结果为空',
|
|||
|
address: '地址为空',
|
|||
|
network: '网络不通',
|
|||
|
order: '订单为空',
|
|||
|
coupon: '优惠券为空',
|
|||
|
favor: '暂无收藏',
|
|||
|
permission: '无权限',
|
|||
|
history: '历史记录为空',
|
|||
|
message: '暂无消息',
|
|||
|
list: '列表为空',
|
|||
|
data: '暂无数据',
|
|||
|
comment: '暂无评论'
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
</script>
|
|||
|
|
|||
|
<style lang="scss" scoped>
|
|||
|
.tn-empty {
|
|||
|
display: flex;
|
|||
|
flex-direction: column;
|
|||
|
align-items: center;
|
|||
|
justify-content: center;
|
|||
|
|
|||
|
&__icon {
|
|||
|
margin-top: 14rpx;
|
|||
|
color: #AAAAAA;
|
|||
|
font-size: 90rpx;
|
|||
|
}
|
|||
|
|
|||
|
&__image {
|
|||
|
width: 160rpx;
|
|||
|
height: 160rpx;
|
|||
|
}
|
|||
|
|
|||
|
&__text {
|
|||
|
display: flex;
|
|||
|
flex-direction: column;
|
|||
|
align-items: center;
|
|||
|
justify-content: center;
|
|||
|
margin-top: 20rpx;
|
|||
|
color: #AAAAAA;
|
|||
|
font-size: 30rpx;
|
|||
|
}
|
|||
|
|
|||
|
&__slot {
|
|||
|
display: flex;
|
|||
|
flex-direction: column;
|
|||
|
align-items: center;
|
|||
|
justify-content: center;
|
|||
|
margin-top: 20rpx;
|
|||
|
}
|
|||
|
}
|
|||
|
</style>
|