lanan-repair-app/components/mote-lines-divide/mote-lines-divide.vue

139 lines
3.0 KiB
Vue
Raw Normal View History

2024-10-09 13:34:36 +08:00
<template>
<view>
<view style="position: relative" v-if="isHide">
<view class="dt-content" :style="'-webkit-line-clamp:'+line">
<text class="content">
<slot>{{ dt ? dt : '' }}</slot>
</text>
</view>
<view class="button-show" @tap="isHide = false" v-if="enableButton&&lines>line">
<text style="color: blue">{{ expandText }}</text>
</view>
</view>
<view v-else>
<view>
<text class="content">
<slot>{{ dt ? dt : '' }}</slot>
</text>
</view>
<view class="fold-hint" v-if="foldHint">
<view @tap="isHide = true">
{{ foldHint }}
</view>
</view>
</view>
<view>
<text class="placeholder">
{{ placeholder }}
</text>
</view>
</view>
</template>
<script>
export default {
data() {
return {
// 是否隐藏多余行。初始状态不隐藏
isHide: true,
// 全量所占文本高度
textHeight: 0,
// 单行文本所占高度
lineHeight: 1,
// 占位文本
placeholder: '占位'
};
},
props: {
// 展示多少行
line: {
type: [Number, String],
default: 1
},
// 文本
dt: {
type: [String],
default: ''
},
enableButton: {
type: Boolean,
default: true
},
// 自定义展开提示
expandText: {
type: String,
default: "展开"
},
// 自定义收起提示
foldHint: {
type: String,
default: "收起"
}
},
watch:{
dt(){
let that = this
setTimeout(() => {
let query = uni.createSelectorQuery().in(that);
// 获取所有文本在html中的高度
query.select('.content').boundingClientRect(data => {
that.textHeight = data.height
}).exec();
}, 100)
}
},
mounted() {
if (this.enableButton) {
let query = uni.createSelectorQuery().in(this);
// 获取所有文本在html中的高度
query.select('.content').boundingClientRect(data => {
this.textHeight = data.height
}).exec();
// 通过占位元素获取单行文本的高度
query.select('.placeholder').boundingClientRect(data => {
this.lineHeight = data.height
}).exec();
}
// 获取单行文本高度后,置空占位元素,使其释放占位
this.placeholder = ''
},
computed: {
// 全文本所占总行数
lines() {
if (!this.enableButton) {
return this.line
}
return Math.floor(this.textHeight > 0 && this.lineHeight > 0 ? this.textHeight / this.lineHeight : 0)
}
}
}
</script>
<style scoped>
.dt-content {
overflow: hidden;
text-overflow: clip;
display: -webkit-box;
-webkit-box-orient: vertical;
}
.button-show {
width: 70rpx;
position: absolute;
right: 0;
bottom: 0;
z-index: 0;
text-align: right;
background-image: linear-gradient(-180deg, rgba(233, 236, 239, 0) 50%, #FFF 80%);
padding-top: 2rem;
}
.fold-hint {
color: blue;
text-align: right
}
</style>