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