luyj-select-lay.vue 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519
  1. <template>
  2. <view class="uni-select-lay" :style="{ 'z-index': zindex }">
  3. <input type="text" :name="name" v-model="value" class="uni-select-input" />
  4. <view class="uni-select-lay-select" :class="{ active: active }">
  5. <!-- 禁用mask -->
  6. <view class="uni-disabled" v-if="disabled"></view>
  7. <!-- 禁用mask -->
  8. <!-- 清空 -->
  9. <view
  10. class="uni-select-lay-input-close"
  11. v-if="changevalue != '' && this.active"
  12. >
  13. <text @click="removevalue"></text>
  14. </view>
  15. <!-- 清空 -->
  16. <input
  17. type="text"
  18. class="uni-select-lay-input"
  19. :class="{ active: changevalue != '' && changevalue != placeholder }"
  20. v-model="changevalue"
  21. :disabled="disabled"
  22. :placeholder="placeholder"
  23. @focus="unifocus"
  24. @input="intchange"
  25. />
  26. <view class="uni-select-lay-icon" @click="select"><text></text></view>
  27. </view>
  28. <!-- 下拉框展示内容 :单选-->
  29. <view
  30. v-if="!multiple"
  31. class="uni-select-lay-options"
  32. :class="
  33. optionsDirection === 'top'
  34. ? 'uni-select-lay-options-top'
  35. : 'uni-select-lay-options-bottom'
  36. "
  37. v-show="active"
  38. >
  39. <!-- 加载中 -->
  40. <template v-if="loading">
  41. <view class="uni-select-lay-item" style="color: #777777">
  42. <image
  43. src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QzlBMzU3OTlEOUM0MTFFOUI0NTZDNERBQURBQzI4RkUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QzlBMzU3OUFEOUM0MTFFOUI0NTZDNERBQURBQzI4RkUiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDOUEzNTc5N0Q5QzQxMUU5QjQ1NkM0REFBREFDMjhGRSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDOUEzNTc5OEQ5QzQxMUU5QjQ1NkM0REFBREFDMjhGRSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pt+ALSwAAA6CSURBVHja1FsLkFZV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"
  44. mode="widthFix"
  45. style="width: 16px; height: 16px; margin-right: 5px"
  46. class=".rotating__animation"
  47. >
  48. </image>
  49. <text>{{ loadingText }}</text>
  50. </view>
  51. </template>
  52. <!-- 加载中 -->
  53. <!-- 未输入是显示内容 -->
  54. <template v-else-if="!changes">
  55. <view
  56. class="uni-select-lay-item"
  57. :class="{ active: value == '' }"
  58. @click="selectitem(-1, null)"
  59. >
  60. {{ placeholder }}
  61. </view>
  62. <view
  63. class="uni-select-lay-item"
  64. :class="{ active: value == item[svalue] }"
  65. v-for="(item, index) in options"
  66. :key="index"
  67. @click="selectitem(index, item)"
  68. >{{ item[slabel] }}</view
  69. >
  70. </template>
  71. <!-- 未输入是显示内容 -->
  72. <!-- 搜索时显示内容 -->
  73. <template v-else>
  74. <template v-if="vlist.length > 0">
  75. <view
  76. class="uni-select-lay-item"
  77. :class="{ active: value == item[svalue] }"
  78. v-for="(item, index) in vlist"
  79. :key="index"
  80. @click="selectitem(index, item)"
  81. >{{ item[slabel] }}
  82. </view>
  83. </template>
  84. <template v-else>
  85. <view class="nosearch">无匹配内容!</view>
  86. </template>
  87. </template>
  88. <!-- 搜索时显示内容 -->
  89. </view>
  90. <!-- 下拉框展示内容 :单选 -->
  91. <!-- 下拉展示内容:多选 -->
  92. <!-- <view v-else class="uni-select-lay-options" :class="optionsDirection === 'top' ? 'uni-select-lay-options-top' :'uni-select-lay-options-bottom' " v-show="active"> -->
  93. <!-- 加载中 -->
  94. <!-- <template v-if="loading">
  95. <view class="uni-select-lay-item" style="color: #777777;">
  96. <image
  97. src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QzlBMzU3OTlEOUM0MTFFOUI0NTZDNERBQURBQzI4RkUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QzlBMzU3OUFEOUM0MTFFOUI0NTZDNERBQURBQzI4RkUiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDOUEzNTc5N0Q5QzQxMUU5QjQ1NkM0REFBREFDMjhGRSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDOUEzNTc5OEQ5QzQxMUU5QjQ1NkM0REFBREFDMjhGRSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pt+ALSwAAA6CSURBVHja1FsLkFZV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"
  98. mode="widthFix" style="width: 16px;height: 16px;margin-right: 5px;" class=".rotating__animation">
  99. </image>
  100. <text>{{loadingText}}</text>
  101. </view>
  102. </template> -->
  103. <!-- 加载中 -->
  104. <!-- 默认显示内容 -->
  105. <!-- <template v-else>
  106. <view class="uni-select-lay-item" :class="{active:value==''}" @click="selectitem(-1,null)">
  107. {{placeholder}}
  108. </view>
  109. <view class="uni-select-lay-item" :class="{active:value==item[svalue]}" v-for="(item,index) in options"
  110. :key="index">
  111. <checkbox></checkbox>
  112. {{item[slabel]}}
  113. </view>
  114. </template> -->
  115. <!-- </view> -->
  116. <!-- 下拉展示内容:多选 -->
  117. </view>
  118. </template>
  119. <script>
  120. /**
  121. * Select 下拉选择插件
  122. * @description 简单的下拉选择插件
  123. * @tutorial url https://ext.dcloud.net.cn/plugin?id=5627
  124. * @property {Boolean} disabled =[true | false] 是否禁用(默认false)
  125. * @property {Number} zindex 层级,默认999,防止多个组件一起使用是下拉栏穿透
  126. * @property {Array} options 数据列表
  127. * @property {String} optionsDirection 数据列表的位置(默认值bottom)
  128. * @value top 数据列表位于上方
  129. * @value bottom 数据列表位于下方
  130. * @property {Boolean} loading 是否加载中
  131. * @property {String} loadingText 加载时提示文字
  132. * @property {Boolean} multiple 是否多选(默认false)
  133. * @property {String} name input字段名
  134. * @property {String} value 默认展示的value值
  135. * @property {String} placeholder 无选项时展示的文字
  136. * @property {String} slabel 自定义列表中键值对应关系 (默认label)(键值对应label)
  137. * @property {String} svalue 自定义列表中键值对应关系(默认value)(键值对应value)
  138. * @event {Function()} selectitem 点击选项时触发事件
  139. */
  140. /**
  141. * 也参考了插件:https://ext.dcloud.net.cn/plugin?id=2868
  142. */
  143. export default {
  144. name: 'luyj-select-lay',
  145. props: {
  146. // 是否禁用
  147. disabled: {
  148. type: Boolean,
  149. default: false
  150. },
  151. // 层级
  152. zindex: {
  153. type: Number,
  154. default: 1
  155. },
  156. // 数据列表
  157. options: {
  158. type: Array,
  159. default () {
  160. return []
  161. }
  162. },
  163. // 数据列表的位置
  164. optionsDirection: {
  165. type: String,
  166. default: 'bottom'
  167. },
  168. // 是否加载中
  169. loading: {
  170. type: Boolean,
  171. default: false
  172. },
  173. // 加载提示文字
  174. loadingText: {
  175. type: String,
  176. default: '数据加载中……'
  177. },
  178. // 是否多选
  179. multiple: {
  180. type: Boolean,
  181. default: false
  182. },
  183. // input字段名
  184. name: {
  185. type: String,
  186. default: ''
  187. },
  188. // 默认展示value值
  189. value: {
  190. type: String,
  191. default: ''
  192. },
  193. // 无选项时展示文字
  194. placeholder: {
  195. type: String,
  196. default: '请选择'
  197. },
  198. // 自定义列表中键值对应关系label
  199. slabel: {
  200. type: String,
  201. default: 'label'
  202. },
  203. // 自定义列表中键值对应关系 value
  204. svalue: {
  205. type: String,
  206. default: 'value'
  207. }
  208. },
  209. data () {
  210. return {
  211. active: false, //组件是否激活,
  212. changevalue: '', //搜索框同步
  213. oldvalue: '', //数据回滚
  214. changes: false, //正在搜索
  215. vlist: [] //搜索框查询的列表
  216. }
  217. },
  218. // created之后,元素加载完毕
  219. mounted () {
  220. this.itemcheck()
  221. },
  222. watch: {
  223. //value改变
  224. value () {
  225. this.itemcheck()
  226. },
  227. //初始化数组
  228. options () {
  229. // 此处判断是否有初始value,存在则判断显示文字
  230. this.itemcheck()
  231. }
  232. },
  233. methods: {
  234. // 单选和多选的方式本身有相似性,这里先分开.后期再改.
  235. // ========================================= 单选 ============================================================
  236. /**
  237. * 判断数组及当前active值
  238. */
  239. itemcheck () {
  240. // 此处判断是否有初始value,存在则判断显示文字
  241. if (this.value != '') {
  242. // 展示plachhoder
  243. //判断数组
  244. if (this.options.length > 0) {
  245. this.options.forEach(item => {
  246. if (this.value == item[this.svalue]) {
  247. this.oldvalue = this.changevalue = item[this.slabel]
  248. return
  249. }
  250. })
  251. }
  252. } else {
  253. this.oldvalue = this.changevalue = ''
  254. }
  255. },
  256. /**
  257. * 点击组件
  258. */
  259. select () {
  260. if (this.disabled) {
  261. return
  262. }
  263. this.active = !this.active
  264. if (this.active) {
  265. this.changes = false
  266. } else {
  267. this.changevalue = this.oldvalue
  268. }
  269. },
  270. /**
  271. * 获得焦点
  272. */
  273. unifocus () {
  274. if (this.disabled) {
  275. return
  276. }
  277. this.active = true
  278. this.changes = false
  279. },
  280. /**
  281. * 移除数据
  282. */
  283. removevalue () {
  284. this.changes = false
  285. this.active = false
  286. this.changevalue = ''
  287. },
  288. /**
  289. * value值改变
  290. */
  291. intchange () {
  292. // if (this.changevalue == '') {
  293. // this.changes = false;
  294. // return;
  295. // };
  296. this.changes = true
  297. this.vlist = this.options.filter(item => {
  298. return item[this.slabel].includes(this.changevalue)
  299. })
  300. },
  301. /** 点击组件列
  302. * @param {Object} index 索引
  303. * @param {Object} item 值
  304. */
  305. selectitem (index, item) {
  306. this.active = false
  307. this.$emit('selectitem', index, item)
  308. }
  309. // =============================================== 多选 =======================================================
  310. }
  311. }
  312. </script>
  313. <style lang="scss" scoped>
  314. .uni-select-lay {
  315. position: relative;
  316. z-index: 999;
  317. .uni-select-input {
  318. opacity: 0;
  319. position: absolute;
  320. z-index: -111;
  321. }
  322. // select部分
  323. .uni-select-lay-select {
  324. user-select: none;
  325. position: relative;
  326. z-index: 3;
  327. height: 36px;
  328. padding: 0 30px 0 10px;
  329. box-sizing: border-box;
  330. border-radius: 4px;
  331. border: 1px solid rgb(229, 229, 229);
  332. display: flex;
  333. align-items: center;
  334. font-size: 14px;
  335. color: #999;
  336. .uni-disabled {
  337. position: absolute;
  338. left: 0;
  339. width: 100%;
  340. height: 100%;
  341. z-index: 19;
  342. cursor: no-drop;
  343. }
  344. // input 框的清除按钮
  345. .uni-select-lay-input-close {
  346. position: absolute;
  347. right: 35px;
  348. top: 0;
  349. height: 100%;
  350. width: 15px;
  351. display: flex;
  352. align-items: center;
  353. justify-content: center;
  354. z-index: 3;
  355. cursor: pointer;
  356. text {
  357. position: relative;
  358. background: #fff;
  359. width: 13px;
  360. height: 13px;
  361. border-radius: 50%;
  362. border: 1px solid #bbb;
  363. &::before,
  364. &::after {
  365. content: '';
  366. position: absolute;
  367. left: 20%;
  368. top: 50%;
  369. height: 1px;
  370. width: 60%;
  371. transform: rotate(45deg);
  372. background-color: #bbb;
  373. }
  374. &::after {
  375. transform: rotate(-45deg);
  376. }
  377. }
  378. }
  379. .uni-select-lay-input {
  380. font-size: 14px;
  381. color: #999;
  382. display: block;
  383. width: 98%;
  384. overflow: hidden;
  385. text-overflow: ellipsis;
  386. white-space: nowrap;
  387. line-height: 30px;
  388. &.active {
  389. color: #333;
  390. }
  391. }
  392. .uni-select-lay-icon {
  393. cursor: pointer;
  394. position: absolute;
  395. right: 0;
  396. top: 0;
  397. height: 100%;
  398. width: 30px;
  399. display: flex;
  400. align-items: center;
  401. justify-content: center;
  402. &::before {
  403. content: '';
  404. width: 1px;
  405. height: 100%;
  406. position: absolute;
  407. left: 0;
  408. top: 0;
  409. background-color: #e5e5e5;
  410. }
  411. text {
  412. display: block;
  413. width: 0;
  414. height: 0;
  415. border-width: 12rpx 12rpx 0;
  416. border-style: solid;
  417. border-color: #bbb transparent transparent;
  418. transition: 0.3s;
  419. }
  420. }
  421. &.active .uni-select-lay-icon {
  422. text {
  423. transform: rotate(180deg);
  424. }
  425. }
  426. }
  427. // options部分
  428. .uni-select-lay-options {
  429. user-select: none;
  430. position: absolute;
  431. left: 0;
  432. width: 100%;
  433. height: 500rpx;
  434. overflow-y: auto;
  435. border-radius: 4px;
  436. border: 1px solid rgb(229, 229, 229);
  437. background: #fff;
  438. padding: 5px 0;
  439. box-sizing: border-box;
  440. z-index: 9;
  441. .uni-select-lay-item {
  442. padding: 0 10px;
  443. box-sizing: border-box;
  444. cursor: pointer;
  445. line-height: 2.5;
  446. transition: 0.3s;
  447. font-size: 14px;
  448. &.active {
  449. background: #007aff;
  450. color: #fff;
  451. &:hover {
  452. background: #007aff;
  453. color: #fff;
  454. }
  455. }
  456. &:hover {
  457. background-color: #f5f5f5;
  458. }
  459. }
  460. .nosearch {
  461. font-size: 16px;
  462. line-height: 3;
  463. text-align: center;
  464. color: #666;
  465. }
  466. }
  467. .uni-select-lay-options-top {
  468. bottom: calc(100% + 5px);
  469. }
  470. .uni-select-lay-options-bottom {
  471. top: calc(100% + 5px);
  472. }
  473. }
  474. .rotating__animation {
  475. -webkit-animation: spin 1s linear 1s 5 alternate;
  476. animation: spin 1s linear infinite;
  477. }
  478. // 旋转
  479. @-webkit-keyframes spin {
  480. from {
  481. -webkit-transform: rotate(0deg);
  482. }
  483. to {
  484. -webkit-transform: rotate(360deg);
  485. }
  486. }
  487. @keyframes spin {
  488. from {
  489. transform: rotate(0deg);
  490. }
  491. to {
  492. transform: rotate(360deg);
  493. }
  494. }
  495. </style>