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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<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>