更新记录

1.0.2(2024-01-31)

修复h5无法触发下拉加载

1.0.1(2024-01-31)

新增说明文档


平台兼容性

Vue2 Vue3
×
App 快应用 微信小程序 支付宝小程序 百度小程序 字节小程序 QQ小程序
HBuilderX 3.1.0 app-vue
钉钉小程序 快手小程序 飞书小程序 京东小程序
H5-Safari Android Browser 微信浏览器(Android) QQ浏览器(Android) Chrome IE Edge Firefox PC-Safari

codeLife-searchSelect

说明

该组件为一个可搜索的下拉选择组件,底层主要是使用uni-easyinputscroll-view组件来实现的。

使用方式

该组件有两种使用方式,分别为懒加载和非懒加载。

  1. 非懒加载的使用方式十分简单。
    <template>
        <view class="content">
            <view style="width: 80%; margin-top: 20rpx; margin-left: 20rpx">
                <codeLife-searchSelect v-model="value" :option-list="optionList"></codeLife-searchSelect>
            </view>
        </view>
    </template>
    <script setup lang="ts">
        import { ref, reactive } from 'vue'
        const optionList = ref<any[]>([])
        const value = ref(undefined)
        const getOptionList = () => {
            optionList.value = Array.from({ length: 10000 }, (item, index) => {
                return { value: index + 1, label: `我是第${index + 1}条数据` }
            })
        }
        getOptionList()
    </script>

    上面我们使用了getOptionList方法来创建了一万条数据,但是我们不必担心组件渲染卡顿的问题,因为非懒加载模式下,组件内部自动做了切片操作,默认每次加载50条数据。

  2. 懒加载的使用就会复杂些,为了保证组件内部的纯洁性,我们不会在组件内部处理过多业务逻辑,懒加载的操作更多需要在页面配合实现。
    <template>
        <view class="content">
            <view style="width: 80%; margin-top: 20rpx; margin-left: 20rpx">
                <codeLife-searchSelect v-model="value2" :option-list="optionList2" is-lazy :load="load" @input="inputHandler"
                    @bottom="bottomHandler" @visibleChange="visibleChange"></codeLife-searchSelect>
            </view>
        </view>
    </template>
    <script setup lang="ts">
        import { ref, reactive } from 'vue'
        import { debounce } from '../../../src/utils/debounce.js'  //防抖函数
        const optionList = ref<any[]>([])
        const getOptionList = () => {
            optionList.value = Array.from({ length: 200 }, (item, index) => {
                return { value: index + 1, label: `我是第${index + 1}条数据` }
            })
        }
        getOptionList()
        const value2 = ref(undefined)
        const load = ref(false)
        const optionList2 = ref<any[]>([])
        const isEnd = ref(false)
        const params = reactive({
            page: 1,
            keyword: '',
            size: 50
        })
        // 模拟接口请求
        const imitateAxios = () => {
            return new Promise((resolve, reject) => {
                const startIndex = (params.page - 1) * params.size
                const endIndex = params.page * params.size
                console.log(params, 'params');
                setTimeout(() => {
                    const list = optionList.value.filter(item => item.label.includes(params.keyword)).slice(startIndex, endIndex)
                    resolve(list)
                }, 1000)
            })
        }
        const getListHandler = (type ?: string) => {
            if (type === 'refresh') {
                isEnd.value = false
            }
            if (isEnd.value) {
                return false
            }
            load.value = true
            imitateAxios().then((res : any) => {
                if (params.size > res.length) {
                    isEnd.value = true
                } else {
                    isEnd.value = false
                }
                if (type === 'refresh') {
                    optionList2.value = res
                } else {
                    optionList2.value = optionList2.value.concat(res)
                }
                load.value = false
            })
        }
        const inputHandler = debounce((val : string) => {
            params.keyword = val
            params.page = 1
            getListHandler('refresh')
        }, 500, { leading: true })
        const bottomHandler = () => {
            params.page++
            getListHandler()
        }
        const visibleChange = () => {
            params.page = 1
            params.keyword = ''
            getListHandler('refresh')
        }
    </script>

    上面是一个完整的懒加载示例。我们先使用getOptionList创建出数据用来模拟数据库,使用imitateAxios模拟接口方法。 getListHandler就是我们用来查询数据的方法,我们需要控制该组件的加载状态(load),判断数据是否已经加载完毕(isEnd),以及手动输入的防抖操作和查询,下拉触底的再次加载。

    为什么不把懒加载业务封装在组件内部

    1. 为了保证组件的纯洁性与防止组件过于冗余,我们将懒加载的业务交还给用户。
    2. 懒加载业务的逻辑对于不同项目来说可能也是各不相同的。我们无法将所有情况都包含到。
    3. 如果接口足够统一规范,其实可以使用组合式函数进行封装,每次使用直接引入即可。

属性列表

属性名 说明 类型 默认值
labelField 选中后显示值的字段 string label
valueField 选中后绑定值的字段 string value
optionList 下拉数据列表 Array []
placeholder 输入提示 string 请输入关键字进行搜索
selectMaxHeight 下拉框最大高度(需要自己带单位) string 300px
modelValue v-model绑定的值 string, number, undefind undefined
pageSize 默认一次加载多少数据 number 50
trim 去空格(both:去除两端空格,left:去除左侧空格,right:去除右侧空格,all:去除所有空格,none:不去除空格) string both
isLazy 是否开启懒加载 boolean false
isPage 是否分页(非懒加载模式可用) string true
emptyText 无数据文本 string 暂无数据
load 加载状态(懒加载模式可用) boolean false
noKeywordNoOption 无关键字不展示下拉数据(非懒加载可用) string false
zIndex 定位层级(如果同时多次使用该组件,可能会出现下面遮挡上面的情况,设置zIndex可以避免该现象) number 9

方法列表

方法名 说明
change 下拉值改变
visibleChange 下拉框出现与隐藏
input 输入框变化
bottom 触底
blur 输入框失焦
focus 输入框聚焦

插槽列表

插槽名 说明 作用域插槽
empty 无数据时的插槽,会覆盖原有的无数据提示
default 每个选项的展示插槽 data:选项数据

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

许可协议

MIT协议

使用中有什么不明白的地方,就向插件作者提问吧~ 我要提问