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

发布时间 2023-05-25 18:23:06作者: 小闫的姑娘

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

 

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

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

二:分析源码

 获取两个重要信息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组件源码比较容易阅读,所以自己改改说不定能适配上自己的业务