|
|
<template> <view class=""> <view class="u-content" :class="[elId]" :style="{ height: isLongContent && !showMore ? showHeight + 'rpx' : 'auto', textIndent: textIndent }"> <slot></slot> </view> <view @tap="toggleReadMore" v-if="isLongContent" class="u-content__showmore-wrap" :class="{ 'u-content__show-more': showMore }" :style="[innerShadowStyle]"> <text class="u-content__showmore-wrap__readmore-btn" :style="{ fontSize: fontSize + 'rpx', color: color }"> {{ showMore ? openText : closeText }} </text> <view class="u-content__showmore-wrap__readmore-btn__icon u-flex"> <u-icon :color="color" :size="fontSize" :name="showMore ? 'arrow-up' : 'arrow-down'"></u-icon> </view> </view> </view> </template>
<script> /** * readMore 阅读更多 * @description 该组件一般用于内容较长,预先收起一部分,点击展开全部内容的场景。 * @tutorial https://www.uviewui.com/components/readMore.html
* @property {String Number} show-height 内容超出此高度才会显示展开全文按钮,单位rpx(默认400) * @property {Boolean} toggle 展开后是否显示收起按钮(默认false) * @property {String} close-text 关闭时的提示文字(默认“展开阅读全文”) * @property {String Number} font-size 提示文字的大小,单位rpx(默认28) * @property {String} text-indent 段落首行缩进的字符个数(默认2em) * @property {String} open-text 展开时的提示文字(默认“收起”) * @property {String} color 提示文字的颜色(默认#2979ff) * @example <u-read-more><rich-text :nodes="content"></rich-text></u-read-more> */ export default { name: "u-read-more", props: { // 默认的显示占位高度,单位为rpx
showHeight: { type: [Number, String], default: 400 }, // 展开后是否显示"收起"按钮
toggle: { type: Boolean, default: false }, // 关闭时的提示文字
closeText: { type: String, default: '展开阅读全文' }, // 展开时的提示文字
openText: { type: String, default: '收起' }, // 提示的文字颜色
color: { type: String, default: '#2979ff' }, // 提示文字的大小
fontSize: { type: [String, Number], default: 28 }, // 是否显示阴影
shadowStyle: { type: Object, default () { return { backgroundImage: "linear-gradient(-180deg, rgba(255, 255, 255, 0) 0%, #fff 80%)", paddingTop: "300rpx", marginTop: "-300rpx" } } }, // 段落首行缩进的字符个数
textIndent: { type: String, default: '2em' }, // open和close事件时,将此参数返回在回调参数中
index: { type: [Number, String], default: '' } }, watch: { paramsChange(val) { this.init(); } }, computed: { paramsChange() { return `${this.toggle}-${this.showHeight}`; }, // 展开后无需阴影,收起时才需要阴影样式
innerShadowStyle() { if (this.showMore) return {}; else return this.shadowStyle } }, data() { return { isLongContent: false, // 是否需要隐藏一部分内容
showMore: false, // 当前隐藏与显示的状态,true-显示,false-收起
elId: this.$u.guid(), // 生成唯一class
}; }, mounted() { this.$nextTick(() => { this.init(); }) }, methods: { init() { this.$uGetRect('.' + this.elId).then(res => { // 判断高度,如果真实内容高度大于占位高度,则显示收起与展开的控制按钮
if (res.height > uni.upx2px(this.showHeight)) { this.isLongContent = true; this.showMore = false; } }) }, // 展开或者收起
toggleReadMore() { this.showMore = !this.showMore; // 如果toggle为false,隐藏"收起"部分的内容
if (this.toggle == false) this.isLongContent = false; // 发出打开或者收齐的事件
this.$emit(this.showMore ? 'open' : 'close', this.index); } } }; </script>
<style lang="scss" scoped> @import "../../libs/css/style.components.scss";
.u-content { font-size: 30rpx; color: $u-content-color; line-height: 1.8; text-align: left; overflow: hidden;
&__show-more { padding-top: 0; background: none; margin-top: 20rpx; }
&__showmore-wrap { position: relative; width: 100%; padding-bottom: 26rpx; @include vue-flex; align-items: center; justify-content: center;
&__readmore-btn { @include vue-flex; align-items: center; justify-content: center; line-height: 1;
&__icon { margin-left: 14rpx; } } } } </style>
|