# yu-select-example
**Repository Path**: yufuhuang/yu-select-example
## Basic Information
- **Project Name**: yu-select-example
- **Description**: 基于 UniApp 的弹出层选择器单选、多选组件,支持单选、多选、搜索、数量输入等功能。专为移动端优化,提供丰富的交互体验。
- **Primary Language**: Unknown
- **License**: Unlicense
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-09-24
- **Last Updated**: 2025-09-24
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# yu-select 选择器组件
基于 UniApp 的弹出层选择器单选、多选组件,支持单选、多选、搜索、数量输入等功能。专为移动端优化,提供丰富的交互体验。
## 功能特性
- ✅ **多种选择模式**:支持单选(radio)和多选(checkbox)模式
- ✅ **智能搜索**:内置搜索功能,支持实时过滤,大小写不敏感
- ✅ **数量管理**:支持数量输入框,可设置选项数量
- ✅ **默认值设置**:支持单选和多选的默认值预设
- ✅ **下拉加载**:支持滚动到底部加载更多数据
- ✅ **全选功能**:多选模式下支持一键全选/全不选
- ✅ **交互优化**:支持点击选中/取消,数量输入自动选中
- ✅ **视觉反馈**:选中状态高亮显示,已选标签展示
- ✅ **多端适配**:响应式设计,完美支持H5、小程序、App
- ✅ **清空功能**:支持一键清空所有选择和数量
- ✅ **防误触**:弹窗滚动不影响背景页面
## 安装使用
1. 将 `uni_modules/yu-select` 目录复制到您的 UniApp 项目的 `uni_modules` 目录下
2. 在页面中引入组件:
```vue
```
## Props 属性
| 属性名 | 类型 | 默认值 | 说明 | 备注 |
|--------|------|--------|------|------|
| dataLists | Array | [] | 数据列表 | 对象数组,每个对象需包含nameKey和valueKey字段 |
| nameKey | String | 'label' | 显示名称的字段名 | 用于列表项显示的文本字段 |
| valueKey | String | 'value' | 值字段名 | 用作唯一标识的字段 |
| numKey | String | 'num' | 数量字段名 | showNum为true时使用的数量字段 |
| show | Boolean | false | 是否显示弹窗 | 控制组件的显示隐藏 |
| type | String | 'radio' | 选择类型 | 'radio'单选 / 'checkbox'多选 |
| showSearch | Boolean | true | 是否显示搜索框 | 开启后可实时搜索过滤数据 |
| showNum | Boolean | false | 是否显示数量输入框 | 开启后每个选项可输入数量 |
| popupTitle | String | '列表选择' | 弹窗标题 | 显示在弹窗顶部的标题文字 |
| placeholder | String | '请输入搜索内容' | 搜索框占位符 | 搜索输入框的提示文字 |
| isClearable | Boolean | false | 是否可清空 | 设为true时会清空所有选择和数量 |
| defaultValue | String/Number/Array | null | 默认选中值 | 单选传值,多选传数组 |
## Events 事件
| 事件名 | 参数 | 说明 | 触发时机 |
|--------|------|------|----------|
| search | keyword | 搜索事件,返回搜索关键词 | 用户输入搜索内容时实时触发 |
| lower | - | 滚动到底部事件,用于加载更多 | 列表滚动到底部时触发 |
| cancel | - | 取消选择事件 | 点击取消按钮或遮罩层时触发 |
| submit | selectedData | 提交选择事件,返回选中的数据 | 点击确认按钮时触发 |
## 使用示例
### 基本单选示例
```vue
```
### 多选带数量示例
```vue
```
### 设置默认值
```vue
```
### 带搜索和下拉加载
```vue
```
### 清空功能
```vue
```
### 自定义字段名
```vue
```
## 数据格式
组件期望的数据格式为对象数组,每个对象至少包含 `nameKey` 和 `valueKey` 对应的字段:
### 标准格式
```javascript
const dataList = [
{ label: '选项1', value: 1, num: 0 },
{ label: '选项2', value: 2, num: 0 },
{ label: '选项3', value: 3, num: 0 }
];
```
### 自定义字段格式
```javascript
const customDataList = [
{ id: 1, cworkStationName: '工作站A', quantity: 0 },
{ id: 2, cworkStationName: '工作站B', quantity: 5 },
{ id: 3, cworkStationName: '工作站C', quantity: 3 }
];
// 对应的组件配置
// nameKey="cworkStationName" valueKey="id" numKey="quantity"
```
### 字段说明
- **nameKey字段**:必需,用于显示的文本内容
- **valueKey字段**:必需,用作唯一标识,支持字符串或数字
- **numKey字段**:可选,当showNum为true时使用,存储数量值
## 返回值格式
组件通过 `submit` 事件返回选中的数据,格式如下:
### 单选模式 (type="radio")
返回单个选中的对象,如果未选中则返回空对象:
```javascript
// 有选中项
{ label: '选项1', value: 1, num: 5 }
// 未选中
{}
```
### 多选模式 (type="checkbox")
返回选中的对象数组:
```javascript
// 选中多项
[
{ label: '选项1', value: 1, num: 5 },
{ label: '选项2', value: 2, num: 3 }
]
// 未选中任何项
[]
```
### 处理返回数据
```javascript
function handleSubmit(selectedData) {
if (type === 'radio') {
if (selectedData && selectedData.value) {
console.log('选中的值:', selectedData.value);
console.log('选中的文本:', selectedData.label);
console.log('输入的数量:', selectedData.num);
} else {
console.log('未选中任何项');
}
} else {
console.log('选中的项数:', selectedData.length);
selectedData.forEach(item => {
console.log(`${item.label}: ${item.num || 0}`);
});
}
}
```
## 样式定制
组件使用 SCSS 编写样式,提供完整的主题色配置:
### 主题变量
```scss
// 主题色配置
$primary-color: #2B8BE4; // 主题色
$primary-light: #EBF5FD; // 浅色背景
$primary-text: #0076F9; // 主要文字色
```
### 自定义主题
可以通过覆盖这些变量来自定义样式:
```scss
// 在你的全局样式文件中
$primary-color: #007AFF; // 自定义主题色
$primary-light: #E3F2FD; // 自定义浅色背景
$primary-text: #1976D2; // 自定义文字色
@import '@/uni_modules/yu-select/components/yu-select/yu-select.vue';
```
### 关键样式类
- `.popup-mask`: 遮罩层样式
- `.popup-content`: 弹窗内容区域
- `.search-box`: 搜索框样式
- `.select-row`: 列表行样式
- `.custom-radio-icon` / `.custom-checkbox-icon`: 选择图标样式
- `.bottons`: 底部按钮区域样式
## 浏览器兼容性
- ✅ H5
- ✅ 微信小程序
- ✅ App
- ✅ 其他小程序平台
## 高级用法
### 交互行为优化
组件提供了多种智能交互:
1. **点击切换选择**:点击已选中项可取消选择
2. **数量输入联动**:
- 输入数量大于0自动选中该项
- 清空数量或输入0自动取消选择
3. **搜索实时过滤**:输入关键词实时过滤列表
4. **全选功能**:多选模式下支持一键全选/取消全选
### 性能优化
```javascript
// 大量数据时建议使用分页加载
function loadMore() {
if (loading || !hasMore) return;
loading = true;
// 模拟接口请求
setTimeout(() => {
const newData = generateData(currentPage + 1);
dataLists.value.push(...newData);
currentPage++;
loading = false;
}, 500);
}
```
### 状态管理
```javascript
// 使用组合式API管理选择状态
const { selectedData, showSelect, handleSubmit } = useSelect();
function useSelect() {
const selectedData = ref([]);
const showSelect = ref(false);
function handleSubmit(data) {
selectedData.value = data;
showSelect.value = false;
// 处理业务逻辑
}
return {
selectedData,
showSelect,
handleSubmit
};
}
```
## 注意事项
1. **滚动穿透防护**:组件使用了 `touchmove.stop.prevent` 来防止弹窗内滚动影响外部页面
2. **数量输入限制**:数量输入框仅在 `showNum="true"` 时显示,支持数字类型输入
3. **搜索功能**:搜索功能默认开启,可通过 `showSearch="false"` 关闭,搜索不区分大小写
4. **多端适配**:组件会自动处理各端的样式差异,特别是安全区域适配
5. **数据响应式**:dataLists 变化时组件会自动更新,支持动态数据源
6. **内存管理**:大量数据时建议使用虚拟滚动或分页加载避免性能问题
7. **字段映射**:确保 dataLists 中的对象包含正确的 nameKey 和 valueKey 字段
8. **默认值设置**:defaultValue 仅在组件初始化时生效,后续变化需要手动处理
## 更新日志
### v1.1.0 (2025-09-24)
**功能增强**
- ✨ 新增点击选中项可取消选择的交互优化
- ✨ 新增数量输入与选择状态的智能联动
- ✨ 优化搜索功能,支持大小写不敏感搜索
- ✨ 新增已选标签展示功能(多选模式)
- ✨ 改进全选/全不选的用户体验
- ✨ 新增清空搜索按钮,提升操作便利性
- 🐛 修复数量输入框在不同选择状态下的显示问题
- 🐛 修复默认值设置在某些情况下不生效的问题
- 💄 优化UI细节,提升视觉体验
- 📝 完善组件注释和文档
**技术改进**
- 🔧 优化数据初始化和更新逻辑
- 🔧 改进组件内部状态管理
- 🔧 增强多端兼容性处理
- ⚡ 提升搜索性能和响应速度
### v1.0.0 (2025-09-23)
**初始版本发布**
- ✅ 支持单选/多选模式
- ✅ 支持搜索功能
- ✅ 支持数量输入
- ✅ 支持默认值设置
- ✅ 支持下拉加载更多
- ✅ 基础UI和交互实现
## 常见问题
### Q: 如何实现异步数据加载?
A: 使用 `@lower` 事件监听滚动到底部,在回调中加载更多数据:
```javascript
function loadMore() {
if (!hasMore || loading) return;
// 异步加载数据并追加到 dataLists
}
```
### Q: 如何自定义选择图标样式?
A: 可以通过覆盖 `.custom-radio-icon` 和 `.custom-checkbox-icon` 类来自定义:
```scss
.custom-radio-icon .circle.checked {
background: your-color;
border-color: your-color;
}
```
### Q: 搜索功能支持哪些匹配规则?
A: 目前支持模糊匹配,匹配 nameKey 字段内容,不区分大小写。
### Q: 如何处理大量数据的性能问题?
A: 建议使用分页加载或虚拟滚动,避免一次性渲染过多DOM元素。
### Q: 组件支持哪些平台?
A: 支持 H5、微信小程序、App 等 UniApp 支持的所有平台。
## 技术支持
如果您在使用过程中遇到问题,可以通过以下方式获取帮助:
1. 查看本文档的常见问题部分
2. 检查控制台是否有错误信息
3. 确认数据格式是否正确
4. 验证组件属性配置是否有误
## 作者
**Yu** - 专注于移动端组件开发
## 许可证
MIT License
---
> 💡 **提示**:建议在使用前先查看示例代码,了解组件的基本用法和配置方式。如需更复杂的功能,可以基于组件进行二次开发。