uniapp之自定义Collapse 折叠面板 (主要让uView的源码适配多端)

博客作者在使用uView插件时遇到小程序不支持自定义折叠面板(Collapse)标题和图标的问题。通过分析uView源码,作者找到了解决方案,删除了对小程序的限制,并提供了修改后的源码示例,使得在小程序中可以自定义这些元素。文章强调了尽管uni-app的一套代码多端适配存在挑战,但通过阅读源码仍能找到适配业务的方法。
摘要由CSDN通过智能技术生成

今天使用uView插件的时候发现Collapse 折叠面板有点问题,主要是小程序了不能自定义标题,图标等,没错又是小程序!每次都是小程序,咱就说一套代码适配多端真的很多坑,尤其是小程序。 好了不废话了,先证明一下官网的确指明小程序不可以自定义使用插槽。如图

 官网Collapse 折叠面板 | uView 2.0 - 全面兼容nvue的uni-app生态框架 - uni-app UI框架

因为研究过uView的源码,有点熟悉(这里也推荐大家去看一下,不仅可以吸取一下解决方案,对组件化开发也有帮助,最重要的是对于本菜鸟来说这个源码相对简单,不知道有没有童鞋去看过element-plus源码,整个过程就是从打开到放弃,超出本人水平了,不过有机会我还是会看的,优秀的代码的确值得学习哈哈哈)

一:源码位置

 demo1那里就是自己项目的命名(这波属于保姆级手摸手讲解了~~~)

二:分析源码

 获取两个重要信息1是源码直接用#ifndef排除了微信小程序使用插槽的可能,2是u-collapse-item中的插槽来源是u-cell组件的(这个很重要,下面有的内容还需要去u-cell了解)

三:解决方案

既然源码排除了在小程序使用插槽的可能,我们就加上这种可能

//源码修改后 ifndef删掉
<template slot="title">
        <slot name="title1">{{title}}</slot>			
</template>
<template slot="icon" >
        <slot name="icon1"></slot>
</template>
<template slot="value" >
        <slot name="value1"></slot>
</template>

<template slot="right-icon">
        <slot name="right-icon1" v-if="$slots['right-icon1']">
        </slot>
        <u-icon name="arrow-right"  v-else></u-icon>
</template>

看到源码有写到小程序不支持<slot name="title" slot="title" />的写法,所以作者才放弃让小程序使用插槽吧,我试了一下只要name="title"和slot="title"的值不一样就行了,所以我选择用title1,icon1,value1,right-icon1作为我要自定义时的命名插槽,那title,icon,value,right-icon是谁呢,很显然是u-cell的命名插槽,去看了一下u-cell关于这个四个插槽的源码,像文字类的title,value很好解决,icon本来u-collapse-item就默认没有只用考虑自定义就得行了,最难的就是right-icon,又要考虑自定义,又要考虑啥也不传使用默认的图标,试了很久都不能两者兼得(这或许是作者考虑组件稳定性而舍弃小程序使用插槽的又一可能吧)

 

看了下u-cell关于right-icon插槽的源码,作者做了个判断有$slots['right-icon']则显示自定义插槽,无则显示默认u-icon。我们在改的时候也根据这个思路改,所以也选择用v-if="$slots['right-icon1']"修改

使用方式

 贴一下代码

//修改源码
<u-cell
    :title="title"
    :value="value"
    :label="label"
    :icon="icon"
    :isLink="isLink"
    :clickable="clickable"
    :border="parentData.border && showBorder"
    @click="clickHandler"
    :arrowDirection="expanded ? 'up' : 'down'"
    :disabled="disabled"
>

    <template slot="title">
            <slot name="title1">{{title}}</slot>

    </template>
    <template slot="icon" >
            <slot name="icon1"></slot>
    </template>
    <template slot="value" >
            <slot name="value1"></slot>
    </template>

    <template slot="right-icon">
            <slot name="right-icon1" v-if="$slots['right-icon1']">
            </slot>
            <u-icon name="arrow-right"  v-else></u-icon>
    </template>
</u-cell>
//使用
<u-collapse accordion>

        <u-collapse-item title="众多利器">
                <text slot="title1" class="u-page__item__title__slot-title">文档指南</text>
                <text slot="value1" class="u-page__item__title__slot-title">自定义内容</text>
                <u-icon name="tags-fill" size="25" slot="icon1"></u-icon>
                <u-icon name="tags-fill" size="25" slot="right-icon1"></u-icon>

                <view class="u-collapse-content">众多的贴心小工具,是您开发过程中召之即来的利器,让您飞镖在手,百步穿杨</view>
        </u-collapse-item>
</u-collapse>

本人验证过修改后可适配多端

总结

uniapp虽然一套代码适配多端的确坑很多,好在相关ui组件源码比较容易阅读,所以自己改改说不定能适配上自己的业务

  • 9
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值