更新记录

1.1.6(2026-05-20) 下载此版本

添加demo示例文件

1.1.5(2026-05-20) 下载此版本

优化布局

1.1.4(2026-05-20) 下载此版本

修复多选不能搜索的问题;

查看更多

平台兼容性

uni-app(4.08)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
- - - - - - - - - - -

uni-app x(4.08)

Chrome Safari Android iOS 鸿蒙 微信小程序
- - - - - -

qiao-select 搜索下拉选择框

一个支持搜索过滤的下拉选择框组件,适用于 uni-app 项目,兼容 Vue2 和 Vue3。无第三方图标依赖,开箱即用。

示例代码:不确定怎么用时,请先查看组件目录下的 example/demo.vue,内含单选、多选、插槽、禁用等完整可运行示例。

特性

  • 支持输入搜索过滤下拉选项(单选、多选均支持)
  • 支持 v-model 双向绑定(Vue2 / Vue3)
  • 支持单选、多选及多选数量限制
  • 支持自定义显示字段、搜索字段、返回值类型
  • 支持弹窗在上方 / 下方展示
  • 支持禁用、清空、不可搜索(纯点击选择)等模式
  • 支持 optionselected 插槽自定义展示
  • 内置中/英/法/西等多语言「暂无数据」等提示

安装

qiao-select 目录放入项目的 uni_modules 下即可,无需安装 uni-icons 等额外插件

引入方式

方式一:easycom 自动引入(推荐)

放入 uni_modules 后,页面中可直接使用组件标签(标签名与文件名一致):

<qiao-select ... />
<!-- 或 -->
<qiaoSelect ... />

方式二:手动引入

import qiaoSelect from '@/uni_modules/qiao-select/components/qiao-select/qiaoSelect.vue'

export default {
  components: { qiaoSelect }
}

Vue2 必须 components 注册;Vue3 手动引入后同样需注册(若未走 easycom)。

更多用法与场景组合请参考 example/demo.vue

快速开始

<view class="select-wrap">
  <qiaoSelect
    :keyId="1"
    :dataList="orgArray"
    phText="请选择机构"
    showKey="name"
    searchKey="name"
    v-model="value"
    @change="onChange"
  />
</view>
data() {
  return {
    orgArray: [
      { id: 1, name: '机构A' },
      { id: 2, name: '机构B' },
      { id: 3, name: '机构C' }
    ],
    value: null
  }
},
methods: {
  onChange(val) {
    console.log('选中:', val) // 清空时为 null
  }
}

属性说明

属性 类型 默认值 说明
dataList Array [] 下拉数据列表
v-model / value / modelValue Object / String / Number / Array - 绑定值;多选时为数组
keyId Number / String - 唯一标识,多个组件并存时用于互斥关闭弹层
showKey String 'name' 列表及输入框展示的字段名
searchKey String 'name' 搜索匹配的字段名;对应字段为空时回退使用 showKey
phText String - 占位提示文字
phColor String '#999999' 占位文字颜色
showBorder Boolean true 是否显示边框
disabled Boolean false 是否禁用
fontSize String '26rpx' 字体大小
align String 'left' 文字对齐:left / center / right
showIcon Boolean true 是否显示展开/收起箭头
clearable Boolean true 是否显示清空按钮
searchable Boolean true 是否可搜索;false 时不使用输入框,不弹出键盘
popupPosition String 'bottom' 弹层位置:bottom(下方)、top(上方)
multiple Boolean false 是否多选
multipleLimit Number 0 多选最大数量,0 表示不限制
onlyChoose Boolean false 仅选择模式:选中后不在输入框回显文字(单选)
returnType String 'object' 返回值类型:object 返回整条数据,key 返回指定字段
returnKey String '' returnType='key' 时必填,指定返回的字段名

事件说明

事件 参数 说明
change item / id / [] / null 选中变化;单选清空为 null,多选清空为 []
search Array 输入搜索时触发,参数为过滤后的列表
blur Object / Array / String / null 失焦时触发;多选返回已选数组,单选 returnType='key' 时返回当前文本

Vue3 同时支持 update:modelValue;Vue2 同时触发 input 事件,与 change 参数一致。

方法

通过 ref 调用:

<qiaoSelect ref="selectRef" ... />
// 清空选中(多选清空为 [],单选为 null)
this.$refs.selectRef.clickClear()

单选模式

基础单选

<qiaoSelect
  :keyId="1"
  :dataList="list"
  showKey="name"
  phText="请选择"
  v-model="value"
/>

returnType = 'key'

只返回指定字段值,适合与后端 id 对接:

<qiaoSelect
  :dataList="list"
  showKey="name"
  returnType="key"
  returnKey="id"
  v-model="selectedId"
/>
// selectedId 示例:1、2、3 ...

不可搜索(纯选择)

不弹出键盘,适合选项较少或移动端点击选择场景:

<qiaoSelect
  :dataList="list"
  showKey="label"
  :searchable="false"
  phText="请选择状态"
  v-model="status"
/>

弹窗在上方

<qiaoSelect popupPosition="top" ... />

多选模式

<qiaoSelect
  :keyId="2"
  :dataList="fruitList"
  showKey="name"
  phText="请选择水果(最多3项)"
  :multiple="true"
  :multipleLimit="3"
  v-model="fruits"
  @change="onFruitsChange"
/>
data() {
  return {
    fruitList: [
      { id: 1, name: '苹果' },
      { id: 2, name: '香蕉' }
    ],
    // returnType='object' 时绑定对象数组
    fruits: []
    // returnType='key' + returnKey='id' 时绑定 [1, 2]
  }
}

多选行为说明:

行为 说明
点击选项 切换选中/取消,弹层保持打开
已选项展示 输入框收起后以顿号「、」拼接 showKey 字段
搜索 searchable=true(默认)时,展开后可输入关键词过滤列表
数量限制 达到 multipleLimit 后再选会 toast 提示
清空 点击 × 或 clickClear(),值为 []

多选 + 搜索交互:

  1. 未聚焦 / 已失焦:输入框显示已选摘要(如「苹果、香蕉」)
  2. 点击输入框聚焦:输入框清空,可输入关键词过滤(已选项不受影响)
  3. 输入框失焦或点击遮罩关闭:恢复显示已选摘要
  4. 弹层打开期间可多次搜索、点选,摘要仅在失焦后回显

设置默认值

// 单选 + returnType='object'
this.value = { id: 1, name: '机构A' }

// 单选 + returnType='key'
this.value = 1

// 多选 + returnType='object'
this.fruits = [{ id: 1, name: '苹果' }, { id: 2, name: '香蕉' }]

// 多选 + returnType='key'
this.fruits = [1, 2]

清空

// 单选
this.value = null
// 或多选
this.fruits = []

// 或调用组件方法
this.$refs.selectRef.clickClear()

插槽

option — 自定义下拉项

<qiaoSelect :dataList="list" v-model="value">
  <template #option="{ item, index, selected }">
    <view class="custom-option" :class="{ active: selected }">
      <text>{{ item.name }}</text>
      <text class="desc">{{ item.desc }}</text>
    </view>
  </template>
</qiaoSelect>
参数 类型 说明
item Object 当前选项数据
index Number 当前索引
selected Boolean 是否已选中

多选模式下,右侧勾选标记(✓)由组件自动渲染,无需在插槽内重复实现。

selected — 自定义已选展示

仅在 searchable=false 时生效(此时使用 view 展示区域,可完全自定义样式)。

<qiaoSelect :dataList="list" v-model="value" :searchable="false">
  <template #selected="{ value, items, text }">
    <view class="custom-selected">
      <text>{{ text || '请选择' }}</text>
    </view>
  </template>
</qiaoSelect>
参数 类型 说明
value Object / Array / String 当前绑定值
items Array 多选时的内部选中项数组
text String 默认拼接好的展示文本

searchable=true 时(含多选默认可搜索),已选内容由输入框展示,不支持 selected 插槽;如需自定义多选展示,请设 searchable=false 后使用本插槽。

数据格式

dataList 每项为普通对象,例如:

{ id: 1, name: '北京', code: 'BJ' }
  • 展示字段由 showKey 指定
  • 搜索字段由 searchKey 指定(缺省时用 showKey
  • 组件内部会为每项生成 qiaoSelectKey 用于模糊匹配,请勿手动依赖该字段做业务逻辑

注意事项

  1. 宽度:外层容器需有明确宽度(如 width: 100%),否则可能撑满异常
  2. 多实例:同一页面多个组件请设置不同 keyId,失焦时自动关闭其他弹层
  3. returnKeyreturnType='key' 时必须配置 returnKey,否则选择时会提示
  4. 多选绑定v-model 始终绑定数组;清空为 [] 而非 null
  5. 依赖:组件使用内置字符图标,不需要安装 uni-icons
  6. Vue2 / Vue3:均使用 v-model;Vue2 绑定 value + input,Vue3 绑定 modelValue + update:modelValue

完整示例

推荐直接打开 example/demo.vue 对照学习。

该文件包含:基础单选、多选、不可搜索、弹窗置顶、returnType='key'、自定义 option 插槽、禁用等场景。

在项目中预览示例,可将该文件复制到 pages 并在 pages.json 中注册,例如:

{
  "path": "pages/qiao-select-demo",
  "style": {
    "navigationBarTitleText": "qiao-select 示例"
  }
}

复制后请将组件引入路径改为:

import qiaoSelect from '@/uni_modules/qiao-select/components/qiao-select/qiaoSelect.vue'

隐私、权限声明

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

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

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

许可协议

MIT协议