UNPKG

uni-multiple-select

Version:

uni-app 多选select组件、select搜索选择页组件;支持H5、微信、百度、支付宝、头条等小程序

668 lines (536 loc) 26.1 kB
# uni-app 多选select组件、select搜索选择页组件 ## 多选select组件 ### 介绍 1. 多选select组件目前只支持多选,单选请用单选select组件 2. 支持配置关键字段 3. 兼容多平台小程序、H5 ### 平台差异说明 | H5 | 微信小程序 | 支付宝小程序 | 百度小程序 | 头条小程序 | | ---- | ---------- | ------------ | ---------- | ---------- | | √ | √ | √ | √ | √ | ### 使用方式 #### 安装 ```bash npm i uni-multiple-select ``` #### 引入 **uni-app的`easycom`在打包的时候是按需引入的,您可以放心引入的组件库,发布打包时会自动剔除您没有使用的组件** 在`pages.json`里面配置如下 ```json { "easycom": { "^lp-(.*)": "uni-multiple-select/components/lp-$1/index.vue" }, "pages": [ //... ] } ``` 在`vue.config.js`里面配置如下 ```js module.exports = { transpileDependencies: [ 'uni-multiple-select', 'uview-ui' ] } ``` #### 基本使用 ```html <lp-multiple-select v-model="show" :list="list" /> ``` ```js data() { return { // 数据源 list: [{ label: "皮皮虾", value: "1" },{ label: "小龙虾", value: "2", disabled: true // 禁用 },{ label: "大龙虾", value: "3" },{ label: "石头蟹", value: "4" }] }; } ``` #### 默认选中项(回显) ```html <lp-multiple-select v-model="show" :list="list" :default-value="defaultSelected" /> ``` ```js data() { return { defaultSelected: ["1", "4"] // 默认选中项(value) } } ``` #### 配置label、value对应的key名称 ```html <lp-multiple-select v-model="show" :list="list" :default-value="defaultSelected" label-name="text" value-name="id" @confirm="confirm" /> ``` #### 获取点击确认后的结果 ```html <lp-multiple-select v-model="show" :list="list" @confirm="confirm" /> ``` ```js methods: { // 确认事件 confirm(selectedData, selectedDataIds) { console.log(selectedData, selectedDataIds); } } ``` #### 完整示例 ```html <template> <view class="content"> <view class="title">多选插件演示</view> <view class="text-area"> <text class="label">当前选中项目:</text> <text class="value" @tap="show = true">{{info || "请选择"}}</text> </view> <lp-multiple-select class="test" v-model="show" :list="list" height="50" :default-value="defaultSelected" label-name="text" value-name="id" title="今日晚餐" @confirm="confirm" > <template v-slot:tips> <view class="multiple-select__empty-tips">空空如也~~</view> </template> </lp-multiple-select> </view> </template> <script> export default { data() { return { show: false, //是否显示 - 双向绑定 list: [], //数据源 defaultSelected: ["3", "5"], // 默认选中项 info: "", }; }, onShow() { //模拟异步数据 setTimeout(() => { this.list = [ { text: "皮皮虾", id: "1" }, { text: "小龙虾", id: "2", disabled: true // 禁用 }, { text: "大龙虾", id: "3" }, { text: "石头蟹", id: "4" }, { text: "兰花蟹", id: "5" }, { text: "面包蟹", id: "6" }, { text: "石斑鱼", id: "7" }, { text: "鲫鱼", id: "8" }, { text: "鲨鱼", id: "9" } ] }, 2000); }, methods: { // 确定事件 confirm(selectedData, selectedDataIds) { console.log(selectedData, selectedDataIds); this.info = selectedData.map(el => el.text).join(); } } }; </script> <style scoped> .title { font-size: 36rpx; color: #2088f9; margin-top: 20vh; text-align: center; } .text-area { width: 100%; margin-top: 5vh; display: flex; justify-content: center; font-size: 28rpx; box-sizing: border-box; padding: 20rpx; } .value { color: #2088f9; } .multiple-select__empty-tips { margin-top: 25%; text-align: center; font-size: 40rpx; color: #e2e2e2; } </style> ``` ### API #### Props | 属性 | 说明 | 类型 | 默认值 | | :--------------------- | :----------------------------------------------------------- | :-------------------- | :----- | | v-model | 双向绑定控制弹出层显示 | Boolean | false | | list | 数据源 | Array | [] | | max | 多选时最大选择数 | Number | 99 | | cancel-text | 取消按钮文字 | String | 取消 | | confirm-text | 确认按钮文字 | String | 确认 | | title | 顶部中间的标题 | String | - | | label-name | 指定 list 中作为展示的 key | String | label | | value-name | 指定 list 中作为 value 的 key | String | value | | height | 弹出层高度,单位vh | Number\|String | 30 | | z-index | 弹出时的z-index值 | Number\|String | 10075 | | mask-close-able | 是否允许点击蒙层关闭 | Boolean | true | | all-show | 是否显示全选 | Boolean | true | | default-value | 默认选中值 | Array[Number\|String] | [] | | safe-area-inset-bottom | 是否开启[底部安全区适配](https://www.uviewui.com/components/safeAreaInset.html#关于uview某些组件safe-area-inset参数的说明) | Boolean | true | #### Option Attributes | 属性 | 说明 | 类型 | 默认值 | | :------- | :------------- | :------ | :----- | | disabled | 是否禁用该选项 | boolean | false | #### Slot | 属性 | 说明 | 默认值 | | :--------- | :------------------- | :-------- | | empty-tips | 自定义空数据时的提示 | 暂无数据~ | #### Events | 事件名 | 说明 | 回调参数 | 版本 | | :------ | :----------------------------- | :----------------------------------- | :--- | | confirm | 点击确定按钮,返回当前选择的值 | 目前的选中选项[Array]与主键值[Array] | - | | cancel | 点击取消或者点击蒙层关闭时触发 | - | - | ## select搜索选择页组件 ### 介绍 1. 接口可配置 2. 支持搜索、分页、多选、单选、返回结果、插槽自定义每一项布局、配置关键字段 3. 兼容多平台、H5 ### 平台差异说明 | H5 | 微信小程序 | 支付宝小程序 | 百度小程序 | 头条小程序 | | ---- | ---------- | ------------ | ---------- | ---------- | | √ | √ | √ | √ | √ | ### 使用方式 #### 安装 ```bash npm install uni-multiple-select ``` #### 引入 本组件内部使用了uview的一些组件:[Navbar](https://www.uviewui.com/components/navbar.html)、[Search](https://www.uviewui.com/components/search.html)、[Checkbox](https://www.uviewui.com/components/checkbox.html)、[ loadMore](https://www.uviewui.com/components/loadMore.html)、[Empty](https://www.uviewui.com/components/empty.html)、[Button](https://www.uviewui.com/components/button.html),在引入上会引入uview,但是请放心,**uni-app的`easycom`在打包的时候是按需引入的,您可以放心引入的组件库,发布打包时会自动剔除您没有使用的组件** ##### 1. 引入uView主JS库 在项目根目录中的`main.js`中,引入并使用uView的JS库,注意这两行要放在`import Vue`之后。 ```js // main.js import uView from "uview-ui"; Vue.use(uView); ``` ##### 2. 在引入uView的全局SCSS主题文件 在项目根目录的`uni.scss`中引入此文件。 ```css /* uni.scss */ @import 'uview-ui/theme.scss'; ``` ##### 3. 引入uView基础样式 注意! 在`App.vue`中**首行**的位置引入,注意给style标签加入lang="scss"属性 ```css <style lang="scss"> /* 注意要写在第一行,同时给style标签加入lang="scss"属性 */ @import "uview-ui/index.scss"; </style> ``` ##### 4. 配置easycom组件模式 在`pages.json`里面配置如下 ```json { "easycom": { "^u-(.*)": "uview-ui/components/u-$1/u-$1.vue", // uview-ui "^lp-(.*)": "uni-multiple-select/components/lp-$1/index.vue" // uni-multiple-select }, "pages": [ //... ] } ``` 在`vue.config.js`里面配置如下 ```js module.exports = { transpileDependencies: [ 'uni-multiple-select', 'uview-ui' ] } ``` #### 基本使用 ##### 1.新建`.vue`,配置页面 ```json { "easycom": { "^u-(.*)": "uview-ui/components/u-$1/u-$1.vue", "^lp-(.*)": "cnpm-uni-select-wx/components/lp-$1/index.vue" }, "pages": [ { "path": "pages/searchSelectPage/index", "style": { "enablePullDownRefresh": true, // 开启下拉刷新 "navigationStyle":"custom" // 取消默认的原生导航栏 } }, ] } ``` ##### 2.基础使用 ```html <lp-search-select url="/resume/search.json" :isPullDownRefresh.sync="isPullDownRefresh" :isReachBottom.sync="isReachBottom" @confirm="confirm" /> ``` ```js <script> export default { components: {}, data() { return { isPullDownRefresh: false, // 触发了下拉 isReachBottom: false // 触发了上拉触底 } }, methods: { // 确认事件 confirm(selectedList, selectedIds) { console.log(selectedList, selectedIds); } }, // 下拉刷新 onPullDownRefresh() { this.isPullDownRefresh = true }, // 上拉加载 onReachBottom() { this.isReachBottom = true } } </script> ``` #### 默认选中项(回显) ```html ``` #### 配置label、value对应的key名称 ```html <lp-search-select url="/resume/search.json" :isPullDownRefresh.sync="isPullDownRefresh" :isReachBottom.sync="isReachBottom" valueName="resId" labelName="userName" @confirm="confirm" /> ``` #### 只搜索查看,没有底部按钮 ```html html<lp-search-select url="/resume/search.json" :isPullDownRefresh.sync="isPullDownRefresh" :isReachBottom.sync="isReachBottom" :showBottomBtnGroups="false" /> ``` #### 完整示例 ```html <template> <view class="page"> <lp-search-select url="/resume/search.json" :isPullDownRefresh.sync="isPullDownRefresh" :isReachBottom.sync="isReachBottom" :loadText="loadText" valueName="resId" labelName="userName" mode="multiple" :searchAttrs="searchAttrs" :navBarAttrs="navBarAttrs" @confirm="confirm" > <!-- 插槽,用来修改每一项布局 --> <template v-slot:row="{ row }"> <view class="list-wrap"> <view class="item-line"> {{ row.userName }} </view> <view class="item-line"> {{ row.sexName }} </view> </view> </template> </lp-search-select> </view> </template> <script> export default { data() { return { isPullDownRefresh: false, // 是否触发了下拉时间 isReachBottom: false, // 是否触发了上拉事件 loadText: { loadmore: '点击或上拉加载更多', loading: '正在加载', nomore: '没有更多了' }, searchAttrs: { 'input-align': 'center' }, navBarAttrs: { backText: "返回" } } }, methods: { confirm(selectedList, selectedIds) { console.log(selectedList, selectedIds); } }, // 下拉刷新 onPullDownRefresh() { this.isPullDownRefresh = true }, // 上拉加载 onReachBottom() { this.isReachBottom = true } } </script> <style lang="scss" scoped> .page { .list-wrap { height: auto; width: 100%; border-bottom: 2rpx dashed #cccccc; } } </style> ``` ### API #### Props | 属性 | 说明 | 类型 | 默认值 | 可选值 | | :---------------- | :----------------------------------------------------------- | :----------------------------------------------------------- | :----------------------------------------------------------- | :--------------- | | request | http request API,***必填*** | Function | uni.request | - | | url | 双向绑定控制弹出层显示,***必填*** | String | - | - | | isPullDownRefresh | 是否触发了下拉加载,***必填*** | Boolean | false | true | | isReachBottom | 是否触发了触底事件,***必填*** | Boolean | false | true | | loadText | 底部加载的文案 | Object | { <br /> loadmore: '轻轻上拉', <br /> loading: '努力加载中', <br /> nomore: '我是有底线的~'<br />} | - | | label-name | 指定接口返回数据中作为展示的 key | String | label | - | | value-name | 指定接口返回数据中作为 value 的 key | String | value | - | | keyword | 顶部搜索关键字 | String | keyword | - | | pageSize | 每页搜索数量;建议调大点,该字段会影响页面触底,进而影响`onReachBottom`的触发 | Number\|String | 20 | - | | query | 其他默认查询参数 | Object | - | - | | mode | 切换单选、多选,默认多选 | String | multiple | single、multiple | | max | 多选时最大选择数 | String\|Number | 999 | - | | isOnlySearch | 只搜索查看,没有底部按钮和checkBox | Boolean | true | false | | cancel-text | 取消按钮文字,必填 | Boolean | false | | | confirm-text | 确认按钮文字 | String | 确认 | | | default-selected | 默认选中值 | **多选**:Array[Number\|String]<br />**单选**:Number\|String | [] | - | | checkboxColor | checkbox 颜色 | String | #007aff | | | qs-stringify | 是否使用qs模块序列化参数 | Boolean | false | true | | navBarAttrs | 导航栏属性 | Object | 见下方navBarAttrs | | | searchAttrs | 搜索组件属性 | Object | 见下方searchAttrs | | #### Option Attributes | 属性 | 说明 | 类型 | 默认值 | | :------- | :------------- | :------ | :----- | | disabled | 是否禁用该选项 | boolean | false | #### navBarAttrs | 属性 | 说明 | 类型 | 默认值 | 可选值 | | ------------- | ------------------------------------------------------------ | ---------------- | ------------------------------------------------------------ | ---------------------------------------------------- | | height | 导航栏高度(不包括状态栏高度在内,内部自动加上),注意这里的单位是**px** | String \| Number | 44 | - | | backIconColor | 左边返回图标的颜色 | String | #606266 | - | | backIconName | 左边返回图标的名称,只能为uView自带的图标,`1.5.5`起由arrow-left调整为nav-back | String | nav-back | [Icon](https://www.uviewui.com/components/icon.html) | | backIconSize | 左边返回图标的大小,单位rpx | String \| Number | 30 | - | | backText | 返回图标右边的辅助提示文字 | String | - | - | | backTextStyle | 返回图标右边的辅助提示文字的样式,对象形式 | Object | { color: '#606266' } | - | | zIndex | 固定在顶部时的`z-index`值 | String \| Number | 980 | - | | isBack | 是否显示导航栏左边返回图标和辅助文字 | Boolean | true | false | | background | 导航栏背景设置(APP和小程序上包括状态栏的颜色),见上方说明 | Object | { backgroundImage: 'linear-gradient(45deg, rgb(28, 187, 180), rgb(141, 198, 63))' } | - | | borderBottom | 导航栏底部是否显示下边框,如定义了较深的背景颜色,可取消此值 | Boolean | true | false | | customBack | 自定义返回逻辑方法,如传入,点击返回按钮执行函数,否则正常返回上一页,注意模板中不需要写方法参数的括号 | Function | - | - | #### searchAttrs | 参数 | 说明 | 类型 | 默认值 | 可选值 | | ---------------- | ------------------------------------------------------------ | ---------------- | ------------ | ---------------------------------------------------- | | shape | 搜索框形状,round-圆形,square-方形 | String | round | square | | bgColor | 搜索框背景颜色 | String | #f2f2f2 | - | | borderColor | 边框颜色,配置了颜色,才会有边框 | String | - | - | | placeholder | 占位文字内容 | String | 请输入关键字 | - | | clearabled | 是否启用清除控件 | Boolean | true | false | | focus | 是否自动获得焦点 | Boolean | false | true | | showAction | 是否显示右侧控件(右侧的"搜索"按钮) | Boolean | true | false | | actionText | 右侧控件文字 | String | 搜索 | - | | actionStyle | 右侧控件的样式,对象形式 | Object | - | - | | inputAlign | 输入框内容水平对齐方式 | String | left | center / right | | height | 输入框高度,单位rpx | String \| Number | 64 | - | | searchIconColor | 搜索图标的颜色,默认同输入框字体颜色 | String | - | - | | color | 输入框字体颜色 | String | #606266 | - | | placeholderColor | placeholder的颜色 | String | #909399 | - | | margin | 组件与其他上下左右元素之间的距离,带单位的字符串形式,如"30rpx"、"30rpx 20rpx"等写法 | String | - | - | | maxlength | 输入框最大能输入的长度,-1为不限制长度 | String \| Number | -1 | - | | inputStyle | 自定义输入框样式,对象形式 | Object | - | - | | searchIcon | 输入框左边的图标,可以为uView图标名称或图片路径 | String | search | [Icon](https://www.uviewui.com/components/icon.html) | #### Slot | 属性 | 说明 | | :--- | :--------------- | | row | 自定义每一项布局 | #### Events | 事件名 | 说明 | 回调参数 | 版本 | | :------ | :----------------------------- | :----------------------------------------------------------- | :--- | | confirm | 点击确定按钮,返回当前选择的值 | 多选:目前的选中选项[Array]与主键值[Array]<br />单选:目前的选中选项[Object] | - | | cancel | 点击取消按钮 | - | - |