uniapp 自定义展开/收起组件(适配H5、微信小程序等)

今天遇到啦个需求,内容展开收起功能,没有的用,那边手搓一个吧

因为项目使用到的也只有H5端和微信小程序端,所以如果其余端开发的话,需要看一下适当的调整,不出意外的话就直接用吧,废话不多说,上菜:

javascript 复制代码
<template>
    <view class="more">
        <view class="more_content" :style="{ maxHeight: getMaxH }">
            <view class="more_content_text" :style="{ fontSize: size + 'rpx' }">
                <slot>{{ text }}</slot>
            </view>
        </view>
        <view class="more_btn" :style="{ fontSize: size + 'rpx' }" v-if="domHeight.inner > domHeight.outer"
            @tap="isMore = !isMore">
            {{ isMore ? '收起' : '展开' }}
        </view>
    </view>
</template>

<script>
export default {
    /**
     * 1、设置maxH,row将会失效
    */
    props: {
        // 文本
        text: {
            type: String,
            default: ''
        },
        // 最大高度 rpx
        maxH: {
            type: Number,
            default: 0
        },
        // 字体大小 rpx
        size: {
            type: Number,
            default: 28
        },
        // 行数
        row: {
            type: Number,
            default: 2
        }
    },
    data() {
        return {
            isMore: false, // 是否显示更多
            domHeight: {
                outer: 0,
                inner: 0,
            }
        }
    },
    async mounted() {
        let outerDom = await this.$util.getDomInfo('.more_content', this);
        let innerDom = await this.$util.getDomInfo('.more_content_text', this);
        this.domHeight = {
            outer: outerDom.height,
            inner: innerDom.height
        }
    },
    computed: {
        getMaxH() {
            let h = this.row * this.size * 1.5;
            // #ifdef MP-WEIXIN
            h -= 8;
            // #endif
            let more = this.domHeight.inner / (uni.upx2px(100) / 100) + 'rpx'; // 展开高度
            let noMore = this.maxH ? (this.maxH + 'rpx') : (h + 'rpx'); // 收起高度
            return this.isMore ? more : noMore
        },
    }
}
</script>

<style lang="scss" scoped>
.more {
    position: relative;

    .more_btn {
        position: absolute;
        right: 0;
        bottom: 0;
        padding-left: 20rpx;
        line-height: 1.5;
        // background: red;
        background: linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 1) 20%, rgba(255, 255, 255, 1) 100%);
    }
}

.more_content {
    overflow: hidden;
    transition: .2s;
}

.more_content_text {
    word-wrap: break-word;
    word-break: break-all;
    white-space: pre-wrap;
    line-height: 1.5;
}
</style>
props 说明 默认值
text 需要显示的文本 -
maxH 设置最大高度(设置maxH后row属性便会失效) 0
size 内容字体大小(行高为1.5倍) 28
row 收起时显示行数(设置maxH后row属性便会失效) 2
[参数说明]

|---------|------|---|
| default | 默认插槽 | - |
[插槽]

可通过text属性传入文本,也可以通过默认插槽传入自定义内容,任君选择~

补充一下组件里面使用到的工具函数:

this.$util.getDomInfo

javascript 复制代码
	getDomInfo: function (id, that) {
		return new Promise((resolve, reject) => {
			if (!id) return reject('id/类名 不能为空')
			if (!that) return reject('this指向不能为空')
			const query = uni.createSelectorQuery().in(that);
			query.select(id).boundingClientRect(data => {
				// console.log("节点离页面顶部的距离为" + data.height);
				resolve(data || {})
			}).exec();
		})
	},
相关推荐
2501_9159184118 小时前
只有 Flutter IPA 文件,通过多工具组合完成有效混淆与保护
android·flutter·ios·小程序·uni-app·iphone·webview
hello kitty w1 天前
2. 微信开发工具快捷键
小程序
计算机毕设指导61 天前
基于微信小程序的丽江市旅游分享系统【源码文末联系】
java·spring boot·微信小程序·小程序·tomcat·maven·旅游
1024小神1 天前
浏览器或小程序限制字体最小12px解决办法
小程序
内存不泄露1 天前
酒店预订管理平台及小程序
小程序
2501_915918411 天前
除了 Perfdog,如何在 Windows 环境中完成 iOS App 的性能测试工作
android·ios·小程序·https·uni-app·iphone·webview
丢,捞仔1 天前
uni-app上架应用添加权限提示框
前端·javascript·uni-app
weixin_lynhgworld1 天前
[特殊字符]短剧小程序开发:开启娱乐新纪元的钥匙[特殊字符]
小程序
程序媛徐师姐1 天前
Java基于微信小程序的鲜花销售系统,附源码+文档说明
java·微信小程序·鲜花销售小程序·java鲜花销售小程序·鲜花销售微信小程序·java鲜花销售系统小程序·java鲜花销售微信小程序
qq_12498707531 天前
基于Spring Boot的“味蕾探索”线上零食购物平台的设计与实现(源码+论文+部署+安装)
java·前端·数据库·spring boot·后端·小程序