189 lines
4.7 KiB
Vue
189 lines
4.7 KiB
Vue
<template>
|
||
<view class="tn-load-more-class tn-load-more">
|
||
<view
|
||
class="tn-load-more__wrap"
|
||
:class="[backgroundColorClass]"
|
||
:style="[loadStyle]"
|
||
>
|
||
<view class="tn-load-more__line"></view>
|
||
<view
|
||
class="tn-load-more__content"
|
||
:class="[{'tn-load-more__content--more': (status === 'loadmore' || status === 'nomore')}]"
|
||
>
|
||
<view class="tn-load-more__loading">
|
||
<tn-loading
|
||
class="tn-load-more__loading__icon"
|
||
:mode="loadingIconType"
|
||
:show="status === 'loading' && loadingIcon"
|
||
:color="loadingIconColor"
|
||
></tn-loading>
|
||
</view>
|
||
<view
|
||
class="tn-load-more__text"
|
||
:class="[fontColorClass, {'tn-load-more__text--dot': (status === 'nomore' && dot)}]"
|
||
:style="[loadTextStyle]"
|
||
>{{ showText }}</view>
|
||
</view>
|
||
<view class="tn-load-more__line"></view>
|
||
</view>
|
||
</view>
|
||
</template>
|
||
|
||
<script>
|
||
import componentsColorMixin from '../../libs/mixin/components_color.js'
|
||
export default {
|
||
name: 'tn-load-more',
|
||
mixins: [componentsColorMixin],
|
||
props: {
|
||
// 加载状态
|
||
// loadmore -> 加载更多
|
||
// loading -> 加载中
|
||
// nomore -> 没有更多
|
||
status: {
|
||
type: String,
|
||
default: 'loadmore'
|
||
},
|
||
// 显示加载图标
|
||
loadingIcon: {
|
||
type: Boolean,
|
||
default: true
|
||
},
|
||
// 加载图标样式,参考tn-loading组件的加载类型
|
||
loadingIconType: {
|
||
type: String,
|
||
default: 'circle'
|
||
},
|
||
// 在圆圈加载状态下,圆圈的颜色
|
||
loadingIconColor: {
|
||
type: String,
|
||
default: ''
|
||
},
|
||
// 显示的文字
|
||
loadText: {
|
||
type: Object,
|
||
default() {
|
||
return {
|
||
loadmore: '加载更多',
|
||
loading: '正在加载...',
|
||
nomore: '没有更多了'
|
||
}
|
||
}
|
||
},
|
||
// 是否显示粗点,在nomore状态下生效
|
||
dot: {
|
||
type: Boolean,
|
||
default: false
|
||
},
|
||
// 自定义组件样式
|
||
customStyle: {
|
||
type: Object,
|
||
default() {
|
||
return {}
|
||
}
|
||
}
|
||
},
|
||
computed: {
|
||
loadStyle() {
|
||
let style = {}
|
||
if (this.backgroundColorStyle) {
|
||
style.backgroundColor = this.backgroundColorStyle
|
||
}
|
||
// 合并用户自定义样式
|
||
if (Object.keys(this.customStyle).length > 0) {
|
||
Object.assign(style, this.customStyle)
|
||
}
|
||
return style
|
||
},
|
||
loadTextStyle() {
|
||
let style = {}
|
||
if (this.fontColorStyle) {
|
||
style.color = this.fontColorStyle
|
||
}
|
||
if (this.fontSizeStyle) {
|
||
style.fontSize = this.fontSizeStyle
|
||
style.lineHeight = this.$tn.string.getLengthUnitValue(this.fontSize + 2, this.fontUnit)
|
||
}
|
||
return style
|
||
},
|
||
// 显示的提示文字
|
||
showText() {
|
||
let text = ''
|
||
if (this.status === 'loadmore') text = this.loadText.loadmore || '加载更多'
|
||
else if (this.status === 'loading') text = this.loadText.loading || '正在加载...'
|
||
else if (this.status === 'nomore' && this.dot) text = this.dotText
|
||
else text = this.loadText.nomore || '没有更多了'
|
||
|
||
return text
|
||
}
|
||
},
|
||
data() {
|
||
return {
|
||
// 粗点
|
||
dotText: '●'
|
||
}
|
||
},
|
||
methods: {
|
||
// 处理加载更多事件
|
||
loadMore() {
|
||
// 只有在 loadmore 状态下点击才会发送点击事件,内容不满一屏时无法触发底部上拉事件,所以需要点击来触发
|
||
if (this.status === 'loadmore') this.$emit('loadmore')
|
||
}
|
||
}
|
||
}
|
||
</script>
|
||
|
||
<style lang="scss" scoped>
|
||
.tn-load-more {
|
||
|
||
&__wrap {
|
||
background-color: transparent;
|
||
display: flex;
|
||
flex-direction: row;
|
||
justify-content: center;
|
||
align-items: center;
|
||
color: $tn-content-color;
|
||
}
|
||
|
||
&__line {
|
||
vertical-align: middle;
|
||
border: 1px solid $tn-content-color;
|
||
width: 50rpx;
|
||
transform: scaleY(0.5);
|
||
}
|
||
|
||
&__content {
|
||
display: flex;
|
||
flex-direction: row;
|
||
justify-content: center;
|
||
align-items: center;
|
||
padding: 0 12rpx;
|
||
|
||
&--more {
|
||
position: relative;
|
||
}
|
||
}
|
||
|
||
&__loading {
|
||
margin-right: 8rpx;
|
||
|
||
&__icon {
|
||
display: flex;
|
||
flex-direction: row;
|
||
justify-content: center;
|
||
align-items: center;
|
||
}
|
||
}
|
||
|
||
&__text {
|
||
overflow: hidden;
|
||
white-space: nowrap;
|
||
text-overflow: ellipsis;
|
||
line-height: 30rpx;
|
||
|
||
&--dot {
|
||
font-size: 28rpx;
|
||
}
|
||
}
|
||
}
|
||
</style>
|