139 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			139 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| <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>
 | 
