多租户商城-商户小程序端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

488 lines
29 KiB

2 years ago
2 years ago
  1. <p align="center">
  2. <a href="https://github.com/liub1934/uni-lb-picker">
  3. <img src="https://img.shields.io/github/stars/liub1934/uni-lb-picker">
  4. </a>
  5. <a href="https://github.com/liub1934/uni-lb-picker/fork">
  6. <img src="https://img.shields.io/github/forks/liub1934/uni-lb-picker">
  7. </a>
  8. <a href="https://github.com/liub1934/uni-lb-picker/issues">
  9. <img src="https://img.shields.io/github/issues/liub1934/uni-lb-picker">
  10. </a>
  11. <a href="https://www.npmjs.com/package/uni-lb-picker">
  12. <img src="https://img.shields.io/npm/v/uni-lb-picker">
  13. </a>
  14. <a href="https://npmcharts.com/compare/uni-lb-picker?minimal=true">
  15. <img src="https://img.shields.io/npm/dm/uni-lb-picker">
  16. </a>
  17. <a href="https://standardjs.com">
  18. <img src="https://img.shields.io/badge/code%20style-standard-brightgreen">
  19. </a>
  20. <a href="https://github.com/liub1934/uni-lb-picker/blob/master/LICENSE">
  21. <img src="https://img.shields.io/github/license/liub1934/uni-lb-picker">
  22. </a>
  23. </p>
  24. 插件市场里面的 picker 选择器不满足自己的需求,所以自己写了一个简单的 picker 选择器,可扩展、可自定义,一般满足日常需要。
  25. Github:[uni-lb-picker](https://github.com/liub1934/uni-lb-picker)
  26. 插件市场:[uni-lb-picker](https://ext.dcloud.net.cn/plugin?id=1111)
  27. H5 Demo:[点击预览](https://github.liubing.me/uni-lb-picker)
  28. > 如果问题最好去 github 反馈,插件市场评论区留下五星好评即可,[点我去反馈](https://github.com/liub1934/uni-lb-picker/issues/new)
  29. > **由于之前`cancel`拼写失误,写成了`common.cancel`,`v1.08`现已修正,如果之前版本有使用`cancel`事件的,更新后请及时修正。**
  30. ## 兼容性
  31. App + Nvue + H5 + 各平台小程序(快应用及 360 未测试)
  32. ## 功能
  33. 1、单选
  34. 2、多级联动,非多级联动,理论支持任意级数
  35. 3、省市区选择,基于多级联动
  36. 4、自定义选择器头部确定取消按钮颜色及插槽支持
  37. 5、选择器可视区自定义滚动个数
  38. 6、自定义数据字段,满足不同人的需求
  39. 7、自定义选择器样式
  40. 8、formatter 格式化自定义显示
  41. 9、单选及非联动选择支持扁平化的简单数据,如下形式:
  42. ```javascript
  43. // 单选列表
  44. list1: ['选项1', '选项2', '选项2'],
  45. // 非联动选择列表
  46. list2: [
  47. ['选项1', '选项2', '选项3'],
  48. ['选项11', '选项22', '选项33'],
  49. ['选项111', '选项222', '选项333']
  50. ]
  51. ```
  52. ## 引入插件
  53. 单独引入,在需要使用的页面上 import 引入即可
  54. ```html
  55. <template>
  56. <view>
  57. <lb-picker></lb-picker>
  58. </view>
  59. </template>
  60. <script>
  61. import LbPicker from '@/components/lb-picker'
  62. export default {
  63. components: {
  64. LbPicker
  65. }
  66. }
  67. </script>
  68. ```
  69. 全局引入,`main.js`中 import 引入并注册即可全局使用
  70. ```jsvascript
  71. import LbPicker from '@/components/lb-picker'
  72. Vue.component("lb-picker", LbPicker)
  73. ```
  74. easycom 引入
  75. `pages.json`加上如下配置:
  76. ```json
  77. "easycom": {
  78. "autoscan": true,
  79. "custom": {
  80. "lb-picker": "@/components/lb-picker/index.vue"
  81. }
  82. }
  83. ```
  84. npm 安装引入:
  85. ```shell
  86. npm install uni-lb-picker
  87. ```
  88. ```jsvascript
  89. import LbPicker from 'uni-lb-picker'
  90. ```
  91. ## 选择器数据格式
  92. ### 单选
  93. 常规数据
  94. ```javascript
  95. list: [
  96. {
  97. label: '选项1',
  98. value: '1'
  99. },
  100. {
  101. label: '选项2',
  102. value: '2'
  103. }
  104. ]
  105. ```
  106. 扁平化简单数据
  107. ```javascript
  108. list: ['选项1', '选项2']
  109. ```
  110. ### 多级联动
  111. ```javascript
  112. list: [
  113. {
  114. label: '选项1',
  115. value: '1',
  116. children: [
  117. {
  118. label: '选项1-1',
  119. value: '1-1',
  120. children: [
  121. {
  122. label: '选项1-1-1',
  123. value: '1-1-1'
  124. }
  125. ]
  126. }
  127. ]
  128. }
  129. ]
  130. ```
  131. ### 非联动选择
  132. 常规数据
  133. ```javascript
  134. list: [
  135. [
  136. { label: '选项1', value: '1' },
  137. { label: '选项2', value: '2' },
  138. { label: '选项3', value: '3' }
  139. ],
  140. [
  141. { label: '选项11', value: '11' },
  142. { label: '选项22', value: '22' },
  143. { label: '选项33', value: '33' }
  144. ],
  145. [
  146. { label: '选项111', value: '111' },
  147. { label: '选项222', value: '222' },
  148. { label: '选项333', value: '333' }
  149. ]
  150. ]
  151. ```
  152. 扁平化简单数据
  153. ```javascript
  154. list: [
  155. ['选项1', '选项2', '选项3'],
  156. ['选项11', '选项22', '选项33'],
  157. ['选项111', '选项222', '选项333']
  158. ]
  159. ```
  160. ## 调用显示选择器
  161. 通过`ref`形式手动调用`show`方法显示,隐藏同理调用`hide`
  162. ```html
  163. <lb-picker ref="picker"></lb-picker>
  164. ```
  165. ```javascript
  166. this.$refs.picker.show() // 显示
  167. this.$refs.picker.hide() // 隐藏
  168. ```
  169. `v1.1.3`新增,将需要点击的元素包裹在`lb-picker`中即可。
  170. ```html
  171. <lb-picker>
  172. <button>点我直接打开选择器</button>
  173. </lb-picker>
  174. ```
  175. ## 绑定值及设置默认值
  176. 支持 vue 中`v-model`写法绑定值,无需自己维护选中值的索引。
  177. ```javascript
  178. <lb-picker v-model="value1"></lb-picker>
  179. <lb-picker v-model="value2"></lb-picker>
  180. data () {
  181. return {
  182. value1: '' // 单选
  183. value2: [] // 多列联动选择
  184. }
  185. }
  186. ```
  187. ## 多个选择器
  188. 通过设置不同的`ref`,然后调用即可
  189. ```javascript
  190. <lb-picker ref="picker1"></lb-picker>
  191. <lb-picker ref="picker2"></lb-picker>
  192. this.$refs.picker1.show() // picker1显示
  193. this.$refs.picker2.show() // picker2显示
  194. ```
  195. ## 省市区选择
  196. 省市区选择是基于多列联动选择,数据来源:[https://github.com/modood/Administrative-divisions-of-China](https://github.com/modood/Administrative-divisions-of-China),
  197. 省市区文件位于`/pages/demos/area-data-min.js`,自行引入即可,可参考`demo3省市区选择`,
  198. 也可使用自己已有的省市区数据,如果数据字段不一样,也可以自定义,参考下方自定义数据字段。
  199. ## 自定义数据字段
  200. 为了满足不同人的需求,插件支持自定义数据字段名称, 插件默认的数据字段如下形式:
  201. ```javascript
  202. list: [
  203. {
  204. label: '选择1',
  205. value: 1,
  206. children: []
  207. },
  208. {
  209. label: '选择1',
  210. value: 1,
  211. children: []
  212. }
  213. ]
  214. ```
  215. 如果你的数据字段和上面不一样,如下形式:
  216. ```javascript
  217. list: [
  218. {
  219. text: '选择1',
  220. id: 1,
  221. child: []
  222. },
  223. {
  224. text: '选择1',
  225. id: 1,
  226. child: []
  227. }
  228. ]
  229. ```
  230. 通过设置参数中的`props`即可,如下所示:
  231. ```javascript
  232. <lb-picker :props="myProps"></lb-picker>
  233. data () {
  234. return {
  235. myProps: {
  236. label: 'text',
  237. value: 'id',
  238. children: 'child'
  239. }
  240. }
  241. }
  242. ```
  243. ## 插槽使用
  244. 选择器支持一些可自定义化的插槽,如选择器的取消和确定文字按钮,如果需要对其自定义处理的话,比如加个 icon 图标之类的,可使用插槽,使用方法如下:
  245. ```html
  246. <lb-picker>
  247. <view slot="cancel-text">我是自定义取消</view>
  248. <view slot="confirm-text">我是自定义确定</view>
  249. </lb-picker>
  250. ```
  251. 也可参考示例中的`demo5`,自定义插槽元素样式交给开发者自由调整,插槽仅提供预留位置。
  252. 其他插槽见下。
  253. ## 参数及事件
  254. ### Props
  255. | 参数 | 说明 | 类型 | 可选值 | 默认值 |
  256. | :--------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------- | :--------------------------------------------------------------- | :------------------------------------------------ |
  257. | value/v-model | 绑定值,联动选择为 Array 类型 | String/Number/Array | - | - |
  258. | mode | 选择器类型,支持单列,多列联动 | String | selector 单选/multiSelector 多级联动/unlinkedSelector 多级非联动 | selector |
  259. | list | 选择器数据(v1.0.7 单选及非联动多选支持扁平数据:['选项 1', '选项 2']) | Array | - | - |
  260. | level | 多列联动层级,仅 mode 为 multiSelector 有效 | Number | - | 1 |
  261. | props | 自定义数据字段 | Object | - | {label:'label',value:'value',children:'children'} |
  262. | cancel-text | 取消文字 | String | - | 取消 |
  263. | cancel-color | 取消文字颜色 | String | - | #999 |
  264. | confirm-text | 确定文字 | String | - | 确定 |
  265. | confirm-color | 确定文字颜色 | String | - | #007aff |
  266. | empty-text | `(v1.0.7 新增)`选择器列表为空的时候显示的文字 | String | - | 暂无数据 |
  267. | empty-color | `(v1.0.7 新增)`暂无数据文字颜色 | String | - | #999 |
  268. | column-num | 可视滚动区域内滚动个数,最好设置奇数值 | Number | - | 5 |
  269. | radius | 选择器顶部圆角,支持 rpx,如 radius="10rpx" | String | - | - |
  270. | column-style | `(v1.1.6 重新新增)`选择器默认样式,仅`nvue`支持,其他端见下`选择器自定义样式`说明 | Object | - | - |
  271. | active-column-style | `(v1.1.6 重新新增)`选择器选中样式,仅`nvue`支持,其他端见下`选择器自定义样式`说明 | Object | - | - |
  272. | loading | 选择器是否显示加载中,可使用 loading 插槽自定义加载效果 | Boolean | - | - |
  273. | mask-color | 遮罩层颜色 | String | - | rgba(0, 0, 0, 0.4) |
  274. | show-mask | `(v1.1.0 新增)`是否显示遮罩层 | Boolean | true/false | true |
  275. | close-on-click-mask | 点击遮罩层是否关闭选择器 | Boolean | true/false | true |
  276. | ~~change-on-init~~ | ~~(v1.0.7 已弃用)初始化时是否触发 change 事件~~ | Boolean | true/false | - |
  277. | dataset | `(v1.0.7 新增)`可以向组件中传递任意的自定义的数据(对象形式数据),如`:dataset="{name:'test'}"`,在`confirm`或`change`事件中可以取到 | Object | - | - |
  278. | show-header | `(v1.0.8 新增)`是否显示选择器头部 | Boolean | - | true |
  279. | inline | `(v1.0.8 新增)`inline 模式,开启后默认显示选择器,无需点击弹出,可以配合`show-header`一起使用 | Boolean | - | - |
  280. | z-index | `(v1.0.9 新增)`选择器层级,遮罩层默认-1 | Number | - | 999 |
  281. | safe-area-inset-bottom | `(v1.1.4 新增)`是否留出底部安全距离(nvue 无效) | Boolean | true/false | true |
  282. | disabled | `(v1.1.4 新增)`是否禁用选择器,禁用后无法弹出选择器 | Boolean | - | - |
  283. | align | `(v1.1.6 新增)`选择器中文字对齐方式,默认居中 | String | left/center/right | center |
  284. | press-enable | `(v1.1.6 新增)`是否开启长按选择器数据`showtoast`弹出`label`提示,部分情况下选择器数据文字过长会显示省略号,如需查看完整的文字内容,可开启此选项,长按后会`showtoast`弹出完整的文字内容,默认不开启(支付宝小程序暂不支持[详情](https://ask.dcloud.net.cn/question/106237)) | Boolean | - | - |
  285. | press-time | `(v1.1.6 新增)`长按触发时间,单位毫秒 ms | Number | - | 500 |
  286. | formatter | `(v1.1.7 新增)`格式化自定义选择器文字内容,`Function`类型,`return`一个字符串(仅`app` `nvue` `h5`支持),`item`当前项信息,`rowIndex`当前数据所在行数,`columnIndex`当前数据所在列数,写法参考[demo14](https://github.com/liub1934/uni-lb-picker/blob/master/pages/demos/demo14/demo14.vue#L206) | Function({ item, rowIndex, columnIndex }) | - | - |
  287. ### 方法
  288. | 方法名 | 说明 | 参数 | 返回值 |
  289. | :------------- | :------------------------------------- | :-------------- | :----------------------------------------------------------------------------------------------------------- |
  290. | show | 打开选择器 | - | |
  291. | hide | 关闭选择器 | - | |
  292. | getColumnsInfo | (v1.1.0 新增)根据 value 获取选择器信息 | 绑定值的`value` | 同`change` `confirm`回调参数,如果传入的`value`获取不到信息则只返回一个含有`dataset`的对象,具体自行打印查看 |
  293. ### Events
  294. | 事件名称 | 说明 | 回调参数 |
  295. | :------- | :--------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
  296. | show | 选择器打开时触发 | - |
  297. | hide | 选择器隐藏时触发 | - |
  298. | change | 选择器滚动时触发,此时不会改变绑定的值 | `{ index, item, value, change }` `index`触发滚动后新的索引,单选时是具体的索引值,多列联动选择时为数组。`item`触发滚动后新的的完整内容,包括`label`、`value`等,单选时为对象,多列选择时为数组对象。`value`触发滚动后新的 value 值,单列选择时为具体值,多列联动选择时为数组。`change`触发事件的类型,详情参考下面的 change 事件备注 |
  299. | confirm | 点击选择器确定时触发,此时会改变绑定的值 | 同上`change`事件说明 |
  300. | cancel | 点击选择器取消时触发 | 同上`change`事件说明 |
  301. ### `change` 事件备注
  302. 如果绑定的值是空的,`change`触发后里面的内容都是列表的第一项。
  303. `change`事件会在以下情况触发:
  304. - 初始化
  305. - 绑定值 value 变化
  306. - 选择器 list 列表变化
  307. - 滚动选择器
  308. 以上情况会在回调函数中都可以取到`change`变化的类型,对应上面的情况包括以下:
  309. - `init`
  310. - `value`
  311. - `list`
  312. - `scroll`
  313. 根据这些类型大家可以在`change`的时候按需处理自己的业务逻辑,`init`现在指挥在调用选择器弹出的时候触发。
  314. 下面的说明情况已失效,如需要在页面显示的时候根据`value`的值显示相应的中文,调用`v1.10`新增的方法`getColumnsInfo`,传入绑定的值即可获取到你想要的所有信息。
  315. ~~比如一种常见的情况,有默认值的时候需要显示默认值的文字,此时可以`change`事件中判断`change`的类型是否是`init`,如果是的话可以取事件回调中的`item`进行显示绑定值对应的文字信息。~~
  316. ```javascript
  317. handleChange (e) {
  318. if (e.change === 'init') {
  319. console.log(e.item.label) // 单选 选项1
  320. console.log(e.item.map(item => item.label).join('-')) // 多选 选项1-选项11
  321. }
  322. }
  323. ```
  324. ### 插槽
  325. | 插槽名 | 说明 |
  326. | :------------ | :--------------------- |
  327. | cancel-text | 选择器取消文字插槽 |
  328. | action-center | 选择器顶部中间插槽 |
  329. | confirm-text | 选择器确定文字插槽 |
  330. | loading | 选择器 loading 插槽 |
  331. | empty | 选择器 空数据 插槽 |
  332. | header-top | 选择器头部顶部插槽 |
  333. | header-bottom | 选择器头部底部插槽 |
  334. | picker-top | 选择器滚动部分顶部插槽 |
  335. | picker-bottom | 选择器滚动部分底部插槽 |
  336. ### 选择器自定义样式
  337. > nvue 专属写法,需要定义`column-style`和`active-column-style`,写法如下:
  338. ```html
  339. <lb-picker
  340. :column-style="columnStyle"
  341. :active-column-style="activeColumnStyle"
  342. ></lb-picker>
  343. ```
  344. ```javascript
  345. data () {
  346. return {
  347. // 默认样式
  348. columnStyle: {
  349. color: '#f0ad4e'
  350. },
  351. // 选择样式
  352. activeColumnStyle: {
  353. color: '#007aff',
  354. fontWeight: 700
  355. }
  356. }
  357. }
  358. ```
  359. > 其他端写法,覆盖默认样式即可。
  360. ```css
  361. <style lang="scss" scoped>
  362. /deep/ .lb-picker {
  363. .lb-picker-column-label {
  364. color: #f0ad4e;
  365. }
  366. .lb-picker-column-active {
  367. .lb-picker-column-label {
  368. color: #007aff;
  369. font-weight: 700;
  370. }
  371. }
  372. }
  373. </style>
  374. ```
  375. 完整代码可以参考`demo9`。
  376. ### 获取选中值的文字
  377. `@confirm`事件中可以拿到:
  378. 单选:
  379. ```javascript
  380. handleConfirm (e) {
  381. console.log(e.item.label) // 选项1
  382. }
  383. ```
  384. 联动选择:
  385. ```javascript
  386. handleConfirm (e) {
  387. console.log(e.item.map(item => item.label).join('-')) // 选项1-选项11
  388. }
  389. ```
  390. ## Tips
  391. 微信小程序端,滚动时在 iOS 自带振动反馈,可在系统设置 -> 声音与触感 -> 系统触感反馈中关闭
  392. ## 其他
  393. 其他功能参考示例 Demo 代码。