You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

180 lines
4.2 KiB
Vue

1 year ago
<template>
<view
class="tm-more relative"
:style="{
height: downOpen ? 'auto !important' : `${hs + 40}px`,
paddingBottom: (downOpen && isRemovBar == false) || (show && !isRemovBar) ? '30px' : 0
}"
>
<view class="tm-more-content"><slot></slot></view>
<view v-if="!downOpen&&show&&showMask" :class="[black_tmeme?'bl':'']" class="tm-more-maskbody absolute"></view>
<view
@click="openMore"
v-if="(!downOpen || isRemovBar == false) && show"
:class="[bgColor,'text-'+iconColor,black_tmeme?'bk':'']"
class="tm-more-mask absolute text-align-center text-size-s text-grey flex-center"
>
<slot name="more" :data="downOpen">
<view class="fulled-height flex-center">
<text>{{downOpen?openLabel:label}}</text>
<view class="tm-more-btn px-24" :class="[downOpen?'on':'']">
<tm-icons :size="24" :color="iconColor" name="icon-angle-down"></tm-icons>
</view>
</view>
</slot>
</view>
</view>
</template>
<script>
/**
* 展开更多
* @property {Number} maxHeight = [] 默认100限定多高时展示更多按钮,单位upx
* @property {Boolean} disabled = [] 默认false,是否禁用禁用后无法展开更多
* @property {Boolean} showMask = [] 默认false,是否显示内容遮罩
* @property {Boolean} open = [] 默认false,需要open.sync是否展开更多可不必填此此值主要是用来手动控制展开和关闭
* @property {Boolean} isRemovBar = [] 默认false,打开后是否隐藏展开更多
* @property {String} icon-color = [] 默认grey,展开更多的图标颜色
* @property {String} bg-color = [] 默认white,展开更多的背景颜色
* @property {String} label = [] 默认展开阅读更多,更多的提示文字
* @property {String} open-label = [] 默认收缩阅读更多,更多的提示文字
* @property {Function} click 点击展开更多时触发
* @property {Function} change 展开更多变换时触发
*/
import tmIcons from "@/tm-vuetify/components/tm-icons/tm-icons.vue"
export default {
components:{tmIcons},
name: 'tm-more',
props: {
// 限定多高时展示更多按钮。
maxHeight: {
type: Number,
default: 100
},
disabled: {
type: Boolean,
default: false
},
black: {
type: Boolean|String,
default: null
},
// 是否默认打开.可使用open.sync双向绑定。
open: {
type: Boolean,
default: false
},
// 打开后,是否隐藏展开更多
isRemovBar: {
type: Boolean,
default: false
},
iconColor: {
type: String,
default: 'grey'
},
// 展开更多 的背景色彩。
bgColor: {
type: String,
default: 'white'
},
label:{
type: String,
default: '展开阅读更多'
},
openLabel:{
type: String,
default: '收缩阅读更多'
},
showMask:{
type: Boolean|String,
default: false
}
},
watch: {
open: function() {
this.downOpen = this.open;
}
},
data() {
return {
downOpen: false,
show: true
};
},
mounted() {
this.$nextTick(function(){
this.downOpen = this.open;
this.getRect()
})
},
updated() {
this.getRect()
},
computed: {
hs: function() {
return uni.upx2px(this.maxHeight) || 100;
},
black_tmeme: function() {
if (this.black !== null) return this.black;
return this.$tm.vx.state().tmVuetify.black;
}
},
methods: {
getRect(){
let t = this;
t.$Querey('.tm-more-content',t,0).then(syninfo=>{
if (syninfo[0].height - 40 <= t.hs) {
t.show = false;
}
}).catch(e => {});
},
openMore() {
this.$emit('click');
if (this.disabled) return;
this.downOpen = !this.downOpen;
this.$emit('change', this.downOpen);
this.$emit('update:open', this.downOpen);
}
}
};
</script>
<style lang="less" scoped>
.tm-more {
overflow: hidden;
.tm-more-content {
overflow: hidden;
}
.tm-more-maskbody{
height: calc(100% - 40px);
bottom: 40px;
z-index: 10;
width: 100%;
background-image: linear-gradient(rgba(255,255,255,0) ,rgba(255,255,255,1));
&.bl{
background-image: linear-gradient(rgba(0,0,0,0) 30%,rgba(0,0,0,1)) !important;
}
}
.tm-more-mask {
bottom: 0;
width: 100%;
height: 40px;
z-index: 10;
.tm-more-btn{
&.on{
transition: all 0.35s;
transform: rotate(180deg);
}
}
}
}
</style>