¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <u-popup |
| | | :show="show" |
| | | @close="closeHandler" |
| | | > |
| | | <view class="u-picker"> |
| | | <u-toolbar |
| | | v-if="showToolbar" |
| | | :cancelColor="cancelColor" |
| | | :confirmColor="confirmColor" |
| | | :cancelText="cancelText" |
| | | :confirmText="confirmText" |
| | | :title="title" |
| | | @cancel="cancel" |
| | | @confirm="confirm" |
| | | ></u-toolbar> |
| | | <picker-view |
| | | class="u-picker__view" |
| | | :indicatorStyle="`height: ${$u.addUnit(itemHeight)}`" |
| | | :value="innerIndex" |
| | | :immediateChange="immediateChange" |
| | | :style="{ |
| | | height: `${$u.addUnit(visibleItemCount * itemHeight)}` |
| | | }" |
| | | @change="changeHandler" |
| | | > |
| | | <picker-view-column |
| | | v-for="(item, index) in innerColumns" |
| | | :key="index" |
| | | class="u-picker__view__column" |
| | | > |
| | | <text |
| | | v-if="$u.test.array(item)" |
| | | class="u-picker__view__column__item u-line-1" |
| | | v-for="(item1, index1) in item" |
| | | :key="index1" |
| | | :style="{ |
| | | height: $u.addUnit(itemHeight), |
| | | lineHeight: $u.addUnit(itemHeight), |
| | | fontWeight: index1 === innerIndex[index] ? 'bold' : 'normal' |
| | | }" |
| | | >{{ getItemText(item1) }}</text> |
| | | </picker-view-column> |
| | | </picker-view> |
| | | <view |
| | | v-if="loading" |
| | | class="u-picker--loading" |
| | | > |
| | | <u-loading-icon mode="circle"></u-loading-icon> |
| | | </view> |
| | | </view> |
| | | </u-popup> |
| | | </template> |
| | | |
| | | <script> |
| | | /** |
| | | * u-picker |
| | | * @description éæ©å¨ |
| | | * @property {Boolean} show æ¯å¦æ¾ç¤ºpickerå¼¹çªï¼é»è®¤ false ï¼ |
| | | * @property {Boolean} showToolbar æ¯å¦æ¾ç¤ºé¡¶é¨çæä½æ ï¼é»è®¤ true ï¼ |
| | | * @property {String} title 顶鍿 é¢ |
| | | * @property {Array} columns 对象æ°ç»ï¼è®¾ç½®æ¯ä¸åçæ°æ® |
| | | * @property {Boolean} loading æ¯å¦æ¾ç¤ºå è½½ä¸ç¶æï¼é»è®¤ false ï¼ |
| | | * @property {String | Number} itemHeight ååä¸ï¼å个é项çé«åº¦ï¼é»è®¤ 44 ï¼ |
| | | * @property {String} cancelText åæ¶æé®çæåï¼é»è®¤ 'åæ¶' ï¼ |
| | | * @property {String} confirmText 确认æé®çæåï¼é»è®¤ 'ç¡®å®' ï¼ |
| | | * @property {String} cancelColor åæ¶æé®çé¢è²ï¼é»è®¤ '#909193' ï¼ |
| | | * @property {String} confirmColor 确认æé®çé¢è²ï¼é»è®¤ '#3c9cff' ï¼ |
| | | * @property {String | Number} visibleItemCount æ¯åä¸å¯è§éé¡¹çæ°éï¼é»è®¤ 5 ï¼ |
| | | * @property {String} keyName é项对象ä¸ï¼éè¦å±ç¤ºç屿§é®åï¼é»è®¤ 'text' ï¼ |
| | | * @property {Boolean} closeOnClickOverlay æ¯å¦å
许ç¹å»é®ç½©å
³ééæ©å¨ï¼é»è®¤ false ï¼ |
| | | * @property {Array} defaultIndex ååçé»è®¤ç´¢å¼ |
| | | * @property {Boolean} immediateChange æ¯å¦å¨æææ¾å¼æ¶ç«å³è§¦åchangeäºä»¶ï¼é»è®¤ false ï¼ |
| | | * @event {Function} close å
³é鿩卿¶è§¦å |
| | | * @event {Function} cancel ç¹å»åæ¶æé®è§¦å |
| | | * @event {Function} change å½éæ©å¼ååæ¶è§¦å |
| | | * @event {Function} confirm ç¹å»ç¡®å®æé®ï¼è¿åå½åéæ©çå¼ |
| | | */ |
| | | import props from './props.js'; |
| | | export default { |
| | | name: 'u-picker', |
| | | mixins: [uni.$u.mpMixin, uni.$u.mixin, props], |
| | | data() { |
| | | return { |
| | | // ä¸ä¸æ¬¡éæ©çåç´¢å¼ |
| | | lastIndex: [], |
| | | // ç´¢å¼å¼ ï¼å¯¹åºpicker-viewçvalue |
| | | innerIndex: [], |
| | | // ååçå¼ |
| | | innerColumns: [], |
| | | // ä¸ä¸æ¬¡çåååç´¢å¼ |
| | | columnIndex: 0, |
| | | } |
| | | }, |
| | | watch: { |
| | | // çå¬é»è®¤ç´¢å¼çååï¼éæ°è®¾ç½®å¯¹åºçå¼ |
| | | defaultIndex: { |
| | | immediate: true, |
| | | handler(n) { |
| | | this.setIndexs(n, true) |
| | | } |
| | | }, |
| | | // çå¬columnsåæ°çåå |
| | | columns: { |
| | | immediate: true, |
| | | handler(n) { |
| | | this.setColumns(n) |
| | | } |
| | | }, |
| | | }, |
| | | methods: { |
| | | // è·åiteméè¦æ¾ç¤ºçæåï¼å¤å«ä¸ºå¯¹è±¡è¿æ¯ææ¬ |
| | | getItemText(item) { |
| | | if (uni.$u.test.object(item)) { |
| | | return item[this.keyName] |
| | | } else { |
| | | return item |
| | | } |
| | | }, |
| | | // å
³ééæ©å¨ |
| | | closeHandler() { |
| | | if (this.closeOnClickOverlay) { |
| | | this.$emit('close') |
| | | } |
| | | }, |
| | | // ç¹å»å·¥å
·æ çåæ¶æé® |
| | | cancel() { |
| | | this.$emit('cancel') |
| | | }, |
| | | // ç¹å»å·¥å
·æ çç¡®å®æé® |
| | | confirm() { |
| | | this.$emit('confirm', { |
| | | indexs: this.innerIndex, |
| | | value: this.innerColumns.map((item, index) => item[this.innerIndex[index]]), |
| | | values: this.innerColumns |
| | | }) |
| | | }, |
| | | // 鿩卿ä¸åçæ°æ®åçååæ¶è§¦å |
| | | changeHandler(e) { |
| | | const { |
| | | value |
| | | } = e.detail |
| | | let index = 0, |
| | | columnIndex = 0 |
| | | // éè¿å¯¹æ¯åå两次çåç´¢å¼ï¼å¾åºå½åååçæ¯åªä¸å |
| | | for (let i = 0; i < value.length; i++) { |
| | | let item = value[i] |
| | | if (item !== (this.lastIndex[i] || 0)) { // æundefinedè½¬ä¸ºåæ³åå¼0 |
| | | // 设置columnIndex为å½ååååçç´¢å¼ |
| | | columnIndex = i |
| | | // indexå为åååä¸çåå项çç´¢å¼ |
| | | index = item |
| | | break // ç»æ¢å¾ªç¯ï¼å³ä½¿å°ä¸æ¬¡å¾ªç¯ï¼ä¹æ¯æ§è½çæå |
| | | } |
| | | } |
| | | this.columnIndex = columnIndex |
| | | const values = this.innerColumns |
| | | // å°å½åçå项ååç´¢å¼ï¼è®¾ç½®ä¸º"ä¸ä¸æ¬¡"çç´¢å¼ååå¼ |
| | | this.setLastIndex(value) |
| | | this.setIndexs(value) |
| | | |
| | | this.$emit('change', { |
| | | // #ifndef MP-WEIXIN || MP-LARK |
| | | // 微信å°ç¨åºä¸è½ä¼ éthisï¼ä¼å 为循ç¯å¼ç¨èæ¥é |
| | | picker: this, |
| | | // #endif |
| | | value: this.innerColumns.map((item, index) => item[value[index]]), |
| | | index, |
| | | indexs: value, |
| | | // values为å½ååååçæ°ç»å
容 |
| | | values, |
| | | columnIndex |
| | | }) |
| | | }, |
| | | // 设置indexç´¢å¼ï¼æ¤æ¹æ³å¯è¢«å¤é¨è°ç¨è®¾ç½® |
| | | setIndexs(index, setLastIndex) { |
| | | this.innerIndex = uni.$u.deepClone(index) |
| | | if (setLastIndex) { |
| | | this.setLastIndex(index) |
| | | } |
| | | }, |
| | | // è®°å½ä¸ä¸æ¬¡çååç´¢å¼ä½ç½® |
| | | setLastIndex(index) { |
| | | // å½è½è¿å
¥æ¤æ¹æ³ï¼æå³çå½å设置çååé»è®¤ç´¢å¼ï¼å³ä¸ºâä¸ä¸æ¬¡âçéä¸å¼ï¼éè¦è®°å½ï¼æ¯å 为changeHandlerä¸ |
| | | // éè¦æ¿ååçååå¼è¿è¡å¯¹æ¯ï¼å¾åºå½ååçæ¹åçæ¯åªä¸å |
| | | this.lastIndex = uni.$u.deepClone(index) |
| | | }, |
| | | // 设置对åºåéé¡¹çææå¼ |
| | | setColumnValues(columnIndex, values) { |
| | | // æ¿æ¢innerColumnsæ°ç»ä¸columnIndexç´¢å¼çå¼ä¸ºvaluesï¼ä½¿ç¨çæ¯æ°ç»çspliceæ¹æ³ |
| | | this.innerColumns.splice(columnIndex, 1, values) |
| | | // æ·è´ä¸ä»½åæçinnerIndexå临æ¶åéï¼å°å¤§äºå½ååååçææçåçé»è®¤ç´¢å¼è®¾ç½®ä¸º0 |
| | | let tmpIndex = uni.$u.deepClone(this.innerIndex) |
| | | for (let i = 0; i < this.innerColumns.length; i++) { |
| | | if (i > this.columnIndex) { |
| | | tmpIndex[i] = 0 |
| | | } |
| | | } |
| | | // 䏿¬¡æ§èµå¼ï¼ä¸è½å个修æ¹ï¼å¦åæ æ |
| | | this.setIndexs(tmpIndex) |
| | | }, |
| | | // è·å对åºåçææé项 |
| | | getColumnValues(columnIndex) { |
| | | // è¿è¡åæ¥é»å¡ï¼å 为å¤é¨å¾å°changeäºä»¶ä¹åï¼å¯è½éè¦æ§è¡setColumnValuesæ´æ°åçå¼ |
| | | // ç´¢å¼å¦æå¨å¤é¨changeçåè°ä¸è°ç¨getColumnValuesçè¯ï¼å¯è½æ æ³å¾å°åæ´åçåå¼ï¼è¿éè¿è¡ä¸å®å»¶æ¶ï¼ä¿è¯å¼çåç¡®æ§ |
| | | (async () => { |
| | | await uni.$u.sleep() |
| | | })() |
| | | return this.innerColumns[columnIndex] |
| | | }, |
| | | // 设置æ´ä½ååçcolumnsçå¼ |
| | | setColumns(columns) { |
| | | this.innerColumns = uni.$u.deepClone(columns) |
| | | // 妿å¨è®¾ç½®ååæ°æ®æ¶ï¼æ²¡æè¢«è®¾ç½®é»è®¤çååç´¢å¼defaultIndexï¼é£ä¹ç¨0å»å¡«å
å®ï¼æ°ç»é¿åº¦ä¸ºåçæ°é |
| | | if (this.innerIndex.length === 0) { |
| | | this.innerIndex = new Array(columns.length).fill(0) |
| | | } |
| | | }, |
| | | // è·åååéä¸å¼å¯¹åºçç´¢å¼ |
| | | getIndexs() { |
| | | return this.innerIndex |
| | | }, |
| | | // è·åååéä¸çå¼ |
| | | getValues() { |
| | | // è¿è¡åæ¥é»å¡ï¼å 为å¤é¨å¾å°changeäºä»¶ä¹åï¼å¯è½éè¦æ§è¡setColumnValuesæ´æ°åçå¼ |
| | | // ç´¢å¼å¦æå¨å¤é¨changeçåè°ä¸è°ç¨getValuesçè¯ï¼å¯è½æ æ³å¾å°åæ´åçåå¼ï¼è¿éè¿è¡ä¸å®å»¶æ¶ï¼ä¿è¯å¼çåç¡®æ§ |
| | | (async () => { |
| | | await uni.$u.sleep() |
| | | })() |
| | | return this.innerColumns.map((item, index) => item[this.innerIndex[index]]) |
| | | } |
| | | }, |
| | | } |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | @import "../../libs/css/components.scss"; |
| | | |
| | | .u-picker { |
| | | position: relative; |
| | | |
| | | &__view { |
| | | |
| | | &__column { |
| | | @include flex; |
| | | flex: 1; |
| | | justify-content: center; |
| | | |
| | | &__item { |
| | | @include flex; |
| | | justify-content: center; |
| | | align-items: center; |
| | | font-size: 16px; |
| | | text-align: center; |
| | | /* #ifndef APP-NVUE */ |
| | | display: block; |
| | | /* #endif */ |
| | | color: $u-main-color; |
| | | |
| | | &--disabled { |
| | | /* #ifndef APP-NVUE */ |
| | | cursor: not-allowed; |
| | | /* #endif */ |
| | | opacity: 0.35; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | &--loading { |
| | | position: absolute; |
| | | top: 0; |
| | | right: 0; |
| | | left: 0; |
| | | bottom: 0; |
| | | @include flex; |
| | | justify-content: center; |
| | | align-items: center; |
| | | background-color: rgba(255, 255, 255, 0.87); |
| | | z-index: 1000; |
| | | } |
| | | } |
| | | </style> |