¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <view class="u-calendar-month-wrapper" ref="u-calendar-month-wrapper"> |
| | | <view v-for="(item, index) in months" :key="index" :class="[`u-calendar-month-${index}`]" |
| | | :ref="`u-calendar-month-${index}`" :id="`month-${index}`"> |
| | | <text v-if="index !== 0" class="u-calendar-month__title">{{ item.year }}å¹´{{ item.month }}æ</text> |
| | | <view class="u-calendar-month__days"> |
| | | <view v-if="showMark" class="u-calendar-month__days__month-mark-wrapper"> |
| | | <text class="u-calendar-month__days__month-mark-wrapper__text">{{ item.month }}</text> |
| | | </view> |
| | | <view class="u-calendar-month__days__day" v-for="(item1, index1) in item.date" :key="index1" |
| | | :style="[dayStyle(index, index1, item1)]" @tap="clickHandler(index, index1, item1)" |
| | | :class="[item1.selected && 'u-calendar-month__days__day__select--selected']"> |
| | | <view class="u-calendar-month__days__day__select" :style="[daySelectStyle(index, index1, item1)]"> |
| | | <text class="u-calendar-month__days__day__select__info" |
| | | :class="[item1.disabled && 'u-calendar-month__days__day__select__info--disabled']" |
| | | :style="[textStyle(item1)]">{{ item1.day }}</text> |
| | | <text v-if="getBottomInfo(index, index1, item1)" |
| | | class="u-calendar-month__days__day__select__buttom-info" |
| | | :class="[item1.disabled && 'u-calendar-month__days__day__select__buttom-info--disabled']" |
| | | :style="[textStyle(item1)]">{{ getBottomInfo(index, index1, item1) }}</text> |
| | | <text v-if="item1.dot" class="u-calendar-month__days__day__select__dot"></text> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </template> |
| | | |
| | | <script> |
| | | // #ifdef APP-NVUE |
| | | // ç±äºnvue䏿¯æç¾åæ¯åä½ï¼éè¦æ¥è¯¢å®½åº¦æ¥è®¡ç®æ¯ä¸ªæ¥æç宽度 |
| | | const dom = uni.requireNativePlugin('dom') |
| | | // #endif |
| | | import dayjs from '../../libs/util/dayjs.js'; |
| | | export default { |
| | | name: 'u-calendar-month', |
| | | mixins: [uni.$u.mpMixin, uni.$u.mixin], |
| | | props: { |
| | | // æ¯å¦æ¾ç¤ºæä»½èæ¯è² |
| | | showMark: { |
| | | type: Boolean, |
| | | default: true |
| | | }, |
| | | // 主é¢è²ï¼å¯¹åºé¨æé®åé䏿¥æææ |
| | | color: { |
| | | type: String, |
| | | default: '#3c9cff' |
| | | }, |
| | | // æä»½æ°æ® |
| | | months: { |
| | | type: Array, |
| | | default: () => [] |
| | | }, |
| | | // æ¥æéæ©ç±»å |
| | | mode: { |
| | | type: String, |
| | | default: 'single' |
| | | }, |
| | | // æ¥æè¡é« |
| | | rowHeight: { |
| | | type: [String, Number], |
| | | default: 58 |
| | | }, |
| | | // mode=multipleæ¶ï¼æå¤å¯éå¤å°ä¸ªæ¥æ |
| | | maxCount: { |
| | | type: [String, Number], |
| | | default: Infinity |
| | | }, |
| | | // mode=rangeæ¶ï¼ç¬¬ä¸ä¸ªæ¥æåºé¨çæç¤ºæå |
| | | startText: { |
| | | type: String, |
| | | default: 'å¼å§' |
| | | }, |
| | | // mode=rangeæ¶ï¼æåä¸ä¸ªæ¥æåºé¨çæç¤ºæå |
| | | endText: { |
| | | type: String, |
| | | default: 'ç»æ' |
| | | }, |
| | | // é»è®¤éä¸çæ¥æï¼mode为multipleærangeæ¯å¿
须为æ°ç»æ ¼å¼ |
| | | defaultDate: { |
| | | type: [Array, String, Date], |
| | | default: null |
| | | }, |
| | | // æå°çå¯éæ¥æ |
| | | minDate: { |
| | | type: [String, Number], |
| | | default: 0 |
| | | }, |
| | | // æå¤§å¯éæ¥æ |
| | | maxDate: { |
| | | type: [String, Number], |
| | | default: 0 |
| | | }, |
| | | // å¦ææ²¡æè®¾ç½®maxDateï¼åå¾åæ¨å¤å°ä¸ªæ |
| | | maxMonth: { |
| | | type: [String, Number], |
| | | default: 2 |
| | | }, |
| | | // æ¯å¦ä¸ºåªè¯»ç¶æï¼åªè¯»ç¶æä¸ç¦æ¢éæ©æ¥æ |
| | | readonly: { |
| | | type: Boolean, |
| | | default: uni.$u.props.calendar.readonly |
| | | }, |
| | | // æ¥æåºé´æå¤å¯é天æ°ï¼é»è®¤æ éå¶ï¼mode = rangeæ¶ææ |
| | | maxRange: { |
| | | type: [Number, String], |
| | | default: Infinity |
| | | }, |
| | | // èå´éæ©è¶
è¿æå¤å¯éå¤©æ°æ¶çæç¤ºææ¡ï¼mode = rangeæ¶ææ |
| | | rangePrompt: { |
| | | type: String, |
| | | default: '' |
| | | }, |
| | | // èå´éæ©è¶
è¿æå¤å¯éå¤©æ°æ¶ï¼æ¯å¦å±ç¤ºæç¤ºææ¡ï¼mode = rangeæ¶ææ |
| | | showRangePrompt: { |
| | | type: Boolean, |
| | | default: true |
| | | }, |
| | | // æ¯å¦å
è®¸æ¥æèå´çèµ·æ¢æ¶é´ä¸ºåä¸å¤©ï¼mode = rangeæ¶ææ |
| | | allowSameDay: { |
| | | type: Boolean, |
| | | default: false |
| | | } |
| | | }, |
| | | data() { |
| | | return { |
| | | // æ¯ä¸ªæ¥æç宽度 |
| | | width: 0, |
| | | // å½åéä¸çæ¥æitem |
| | | item: {}, |
| | | selected: [] |
| | | } |
| | | }, |
| | | watch: { |
| | | selectedChange: { |
| | | immediate: true, |
| | | handler(n) { |
| | | this.setDefaultDate() |
| | | } |
| | | } |
| | | }, |
| | | computed: { |
| | | // å¤ä¸ªæ¡ä»¶çååï¼ä¼å¼èµ·é䏿¥æçååï¼è¿éç»ä¸ç®¡ççå¬ |
| | | selectedChange() { |
| | | return [this.minDate, this.maxDate, this.defaultDate] |
| | | }, |
| | | dayStyle(index1, index2, item) { |
| | | return (index1, index2, item) => { |
| | | const style = {} |
| | | let week = item.week |
| | | // ä¸è¿è¡åèäºå
¥çå½¢å¼ä¿ç2ä½å°æ° |
| | | const dayWidth = Number(parseFloat(this.width / 7).toFixed(3).slice(0, -1)) |
| | | // å¾åºæ¯ä¸ªæ¥æç宽度 |
| | | // #ifdef APP-NVUE |
| | | style.width = uni.$u.addUnit(dayWidth) |
| | | // #endif |
| | | style.height = uni.$u.addUnit(this.rowHeight) |
| | | if (index2 === 0) { |
| | | // è·åå½å为ææå ï¼å¦æä¸º0ï¼å为ææå¤©ï¼åä¸ä¸ºæ¯æç¬¬ä¸å¤©æ¶ï¼éè¦åå·¦åç§»çitemä¸ªæ° |
| | | week = (week === 0 ? 7 : week) - 1 |
| | | style.marginLeft = uni.$u.addUnit(week * dayWidth) |
| | | } |
| | | if (this.mode === 'range') { |
| | | // 乿以éè¦è¿ä¹åï¼æ¯å 为DCloudå
¬å¸çiOS客æ·ç«¯çå¼åè
è½åæé导è´çbug |
| | | style.paddingLeft = 0 |
| | | style.paddingRight = 0 |
| | | style.paddingBottom = 0 |
| | | style.paddingTop = 0 |
| | | } |
| | | return style |
| | | } |
| | | }, |
| | | daySelectStyle() { |
| | | return (index1, index2, item) => { |
| | | let date = dayjs(item.date).format("YYYY-MM-DD"), |
| | | style = {} |
| | | // 夿dateæ¯å¦å¨selectedæ°ç»ä¸ï¼å 为æä»½å¯è½ä¼éè¦è¡¥0ï¼æä»¥ä½¿ç¨dateSame夿ï¼èä¸ç¨æ°ç»çincludes夿 |
| | | if (this.selected.some(item => this.dateSame(item, date))) { |
| | | style.backgroundColor = this.color |
| | | } |
| | | if (this.mode === 'single') { |
| | | if (date === this.selected[0]) { |
| | | // å 为éè¦å¯¹nvueçå
¼å®¹ï¼åªè½è¿ä¹åï¼æ æ³ç¼©åï¼ä¹æ æ³éè¿ç±»åæ§å¶çç |
| | | style.borderTopLeftRadius = '3px' |
| | | style.borderBottomLeftRadius = '3px' |
| | | style.borderTopRightRadius = '3px' |
| | | style.borderBottomRightRadius = '3px' |
| | | } |
| | | } else if (this.mode === 'range') { |
| | | if (this.selected.length >= 2) { |
| | | const len = this.selected.length - 1 |
| | | // 第ä¸ä¸ªæ¥æè®¾ç½®å·¦ä¸è§åå·¦ä¸è§çåè§ |
| | | if (this.dateSame(date, this.selected[0])) { |
| | | style.borderTopLeftRadius = '3px' |
| | | style.borderBottomLeftRadius = '3px' |
| | | } |
| | | // æåä¸ä¸ªæ¥æè®¾ç½®å³ä¸è§åå³ä¸è§çåè§ |
| | | if (this.dateSame(date, this.selected[len])) { |
| | | style.borderTopRightRadius = '3px' |
| | | style.borderBottomRightRadius = '3px' |
| | | } |
| | | // å¤äºç¬¬ä¸åæåä¸ä¸ªä¹é´çæ¥æï¼èæ¯è²è®¾ç½®ä¸ºæµ
è²ï¼éè¿å°å¯¹åºé¢è²è¿è¡çåï¼ååå
¶å°¾é¨çé¢è²å¼ |
| | | if (dayjs(date).isAfter(dayjs(this.selected[0])) && dayjs(date).isBefore(dayjs(this |
| | | .selected[len]))) { |
| | | style.backgroundColor = uni.$u.colorGradient(this.color, '#ffffff', 100)[90] |
| | | // å¢å ä¸ä¸ªéæåº¦ï¼è®©èå´åºé´çèæ¯è²ä¹è½çå°åºé¨çmarkæ°´å°å符 |
| | | style.opacity = 0.7 |
| | | } |
| | | } else if (this.selected.length === 1) { |
| | | // 乿以éè¦è¿ä¹åï¼æ¯å 为DCloudå
¬å¸çiOS客æ·ç«¯çå¼åè
è½åæé导è´çbug |
| | | // è¿è¡è¿åæä½ï¼å¦åå¨nvueçiOSï¼uni-appæbugï¼ä¼å¯¼è´è¯¡å¼çè¡¨ç° |
| | | style.borderTopLeftRadius = '3px' |
| | | style.borderBottomLeftRadius = '3px' |
| | | } |
| | | } else { |
| | | if (this.selected.some(item => this.dateSame(item, date))) { |
| | | style.borderTopLeftRadius = '3px' |
| | | style.borderBottomLeftRadius = '3px' |
| | | style.borderTopRightRadius = '3px' |
| | | style.borderBottomRightRadius = '3px' |
| | | } |
| | | } |
| | | return style |
| | | } |
| | | }, |
| | | // æä¸ªæ¥ææ¯å¦è¢«éä¸ |
| | | textStyle() { |
| | | return (item) => { |
| | | const date = dayjs(item.date).format("YYYY-MM-DD"), |
| | | style = {} |
| | | // éä¸çæ¥æï¼æç¤ºæå设置ç½è² |
| | | if (this.selected.some(item => this.dateSame(item, date))) { |
| | | style.color = '#ffffff' |
| | | } |
| | | if (this.mode === 'range') { |
| | | const len = this.selected.length - 1 |
| | | // 妿æ¯èå´éæ©æ¨¡å¼ï¼ç¬¬ä¸ä¸ªåæåä¸ä¸ªä¹é´çæ¥æï¼æåé¢è²è®¾ç½®ä¸ºé«äº®ç主é¢è² |
| | | if (dayjs(date).isAfter(dayjs(this.selected[0])) && dayjs(date).isBefore(dayjs(this |
| | | .selected[len]))) { |
| | | style.color = this.color |
| | | } |
| | | } |
| | | return style |
| | | } |
| | | }, |
| | | // è·ååºé¨çæç¤ºæå |
| | | getBottomInfo() { |
| | | return (index1, index2, item) => { |
| | | const date = dayjs(item.date).format("YYYY-MM-DD") |
| | | const bottomInfo = item.bottomInfo |
| | | // å½ä¸ºæ¥æèå´æ¨¡å¼æ¶ï¼ä¸éæ©çæ¥æä¸ªæ°å¤§äº0æ¶ |
| | | if (this.mode === 'range' && this.selected.length > 0) { |
| | | if (this.selected.length === 1) { |
| | | // éæ©äºä¸ä¸ªæ¥ææ¶ï¼å¦æå½åæ¥æä¸ºæ°ç»ä¸ç第ä¸ä¸ªæ¥æï¼åæ¾ç¤ºåºé¨æå为âå¼å§â |
| | | if (this.dateSame(date, this.selected[0])) return this.startText |
| | | else return bottomInfo |
| | | } else { |
| | | const len = this.selected.length - 1 |
| | | // 妿æ°ç»ä¸çæ¥æå¤§äº2个æ¶ï¼ç¬¬ä¸ä¸ªåæåä¸ä¸ªæ¾ç¤ºä¸ºå¼å§åç»ææ¥æ |
| | | if (this.dateSame(date, this.selected[0]) && this.dateSame(date, this.selected[1]) && |
| | | len === 1) { |
| | | // 妿é¿åº¦ä¸º2ï¼ä¸ç¬¬ä¸ä¸ªçäºç¬¬äºä¸ªæ¥æï¼åæç¤ºè¯æ¾å¨åä¸ä¸ªitemä¸ |
| | | return `${this.startText}/${this.endText}` |
| | | } else if (this.dateSame(date, this.selected[0])) { |
| | | return this.startText |
| | | } else if (this.dateSame(date, this.selected[len])) { |
| | | return this.endText |
| | | } else { |
| | | return bottomInfo |
| | | } |
| | | } |
| | | } else { |
| | | return bottomInfo |
| | | } |
| | | } |
| | | } |
| | | }, |
| | | mounted() { |
| | | this.init() |
| | | }, |
| | | methods: { |
| | | init() { |
| | | // åå§åé»è®¤éä¸ |
| | | this.$emit('monthSelected', this.selected) |
| | | this.$nextTick(() => { |
| | | // è¿ééè¦å¦ä¸ä¸ªå»¶æ¶ï¼å 为è·å宽度åï¼ä¼è¿è¡æä»½æ°æ®æ¸²æï¼åªææ¸²æå®æä¹åï¼ææçæ£çé«åº¦ |
| | | // å 为nvueä¸ï¼$nextTick并䏿¯100%å¯é ç |
| | | uni.$u.sleep(10).then(() => { |
| | | this.getWrapperWidth() |
| | | this.getMonthRect() |
| | | }) |
| | | }) |
| | | }, |
| | | // å¤æä¸¤ä¸ªæ¥ææ¯å¦ç¸ç |
| | | dateSame(date1, date2) { |
| | | return dayjs(date1).isSame(dayjs(date2)) |
| | | }, |
| | | // è·åæä»½æ°æ®åºåç宽度ï¼å 为nvue䏿¯æç¾åæ¯ï¼æä»¥æ æ³éè¿css设置æ¯ä¸ªæ¥æitemç宽度 |
| | | getWrapperWidth() { |
| | | // #ifdef APP-NVUE |
| | | dom.getComponentRect(this.$refs['u-calendar-month-wrapper'], res => { |
| | | this.width = res.size.width |
| | | }) |
| | | // #endif |
| | | // #ifndef APP-NVUE |
| | | this.$uGetRect('.u-calendar-month-wrapper').then(size => { |
| | | this.width = size.width |
| | | }) |
| | | // #endif |
| | | }, |
| | | getMonthRect() { |
| | | // è·åæ¯ä¸ªæä»½æ°æ®ç尺寸ï¼ç¨äºç¶ç»ä»¶å¨scroll-viewæ»å¨äºä»¶ä¸ï¼çå¬å½åæ»å¨å°äºç¬¬å 个æä»½ |
| | | const promiseAllArr = this.months.map((item, index) => this.getMonthRectByPromise( |
| | | `u-calendar-month-${index}`)) |
| | | // 䏿¬¡æ§è¿å |
| | | Promise.all(promiseAllArr).then( |
| | | sizes => { |
| | | let height = 1 |
| | | const topArr = [] |
| | | for (let i = 0; i < this.months.length; i++) { |
| | | // æ·»å å°monthsæ°ç»ä¸ï¼ä¾scroll-viewæ»å¨äºä»¶ä¸ï¼å¤æå½åæ»å¨å°åªä¸ªæä»½ |
| | | topArr[i] = height |
| | | height += sizes[i].height |
| | | } |
| | | // ç±äºå¾®ä¿¡ä¸ï¼æ æ³éè¿this.months[i].topçå½¢å¼(å¼ç¨ç±»å)å»ä¿®æ¹ç¶ç»ä»¶çmonthçtopå¼ï¼æä»¥ä½¿ç¨äºä»¶å½¢å¼å¯¹å¤ååº |
| | | this.$emit('updateMonthTop', topArr) |
| | | }) |
| | | }, |
| | | // è·åæ¯ä¸ªæä»½åºåç尺寸 |
| | | getMonthRectByPromise(el) { |
| | | // #ifndef APP-NVUE |
| | | // $uGetRect为uViewèªå¸¦çèç¹æ¥è¯¢ç®åæ¹æ³ï¼è¯¦è§ææ¡£ä»ç»ï¼https://www.uviewui.com/js/getRect.html |
| | | // ç»ä»¶å
é¨ä¸è¬ç¨this.$uGetRectï¼å¯¹å¤ç为uni.$u.getRectï¼äºè
åè½ä¸è´ï¼åç§°ä¸å |
| | | return new Promise(resolve => { |
| | | this.$uGetRect(`.${el}`).then(size => { |
| | | resolve(size) |
| | | }) |
| | | }) |
| | | // #endif |
| | | |
| | | // #ifdef APP-NVUE |
| | | // nvueä¸ï¼ä½¿ç¨domæ¨¡åæ¥è¯¢å
ç´ é«åº¦ |
| | | // è¿åä¸ä¸ªpromiseï¼è®©è°ç¨æ¤æ¹æ³ç主ä½è½ä½¿ç¨thenåè° |
| | | return new Promise(resolve => { |
| | | dom.getComponentRect(this.$refs[el][0], res => { |
| | | resolve(res.size) |
| | | }) |
| | | }) |
| | | // #endif |
| | | }, |
| | | // ç¹å»æä¸ä¸ªæ¥æ |
| | | clickHandler(index1, index2, item) { |
| | | if (this.readonly) { |
| | | return; |
| | | } |
| | | this.item = item |
| | | const date = dayjs(item.date).format("YYYY-MM-DD") |
| | | if (item.disabled) return |
| | | // 对ä¸ä¸æ¬¡éæ©çæ¥ææ°ç»è¿è¡æ·±åº¦å
é |
| | | let selected = uni.$u.deepClone(this.selected) |
| | | if (this.mode === 'single') { |
| | | // åéæ
åµä¸ï¼è®©æ°ç»ä¸çå
ç´ ä¸ºå½åç¹å»çæ¥æ |
| | | selected = [date] |
| | | } else if (this.mode === 'multiple') { |
| | | if (selected.some(item => this.dateSame(item, date))) { |
| | | // 妿ç¹å»çæ¥æå·²å¨æ°ç»ä¸ï¼åè¿è¡ç§»é¤æä½ï¼ä¹å°±æ¯è¾¾å°åéçææ |
| | | const itemIndex = selected.findIndex(item => item === date) |
| | | selected.splice(itemIndex, 1) |
| | | } else { |
| | | // 妿ç¹å»çæ¥æä¸å¨æ°ç»ä¸ï¼ä¸å·²æçé¿åº¦å°äºæ»å¯éé¿åº¦æ¶ï¼åæ·»å å°æ°ç»ä¸å» |
| | | if (selected.length < this.maxCount) selected.push(date) |
| | | } |
| | | } else { |
| | | // éæ©åºé´å½¢å¼ |
| | | if (selected.length === 0 || selected.length >= 2) { |
| | | // å¦æåæ¥å°±ä¸º0æè
大äº2çé¿åº¦ï¼åå½åç¹å»çæ¥æï¼å°±æ¯å¼å§æ¥æ |
| | | selected = [date] |
| | | } else if (selected.length === 1) { |
| | | // 妿已ç»éæ©äºå¼å§æ¥æ |
| | | const existsDate = selected[0] |
| | | // 妿å½åéæ©çæ¥æå°äºä¸ä¸æ¬¡éæ©çæ¥æï¼åå½åçæ¥æå®ä¸ºå¼å§æ¥æ |
| | | if (dayjs(date).isBefore(existsDate)) { |
| | | selected = [date] |
| | | } else if (dayjs(date).isAfter(existsDate)) { |
| | | // å½åæ¥æå廿大å¯éçæ¥æå¤©æ°ï¼å¦æå¤§äºèµ·å§æ¶é´ï¼åè¿è¡æç¤º |
| | | if(dayjs(dayjs(date).subtract(this.maxRange, 'day')).isAfter(dayjs(selected[0])) && this.showRangePrompt) { |
| | | if(this.rangePrompt) { |
| | | uni.$u.toast(this.rangePrompt) |
| | | } else { |
| | | uni.$u.toast(`鿩天æ°ä¸è½è¶
è¿ ${this.maxRange} 天`) |
| | | } |
| | | return |
| | | } |
| | | // 妿å½åæ¥æå¤§äºå·²ææ¥æï¼å°å½åçæ·»å å°æ°ç»å°¾é¨ |
| | | selected.push(date) |
| | | const startDate = selected[0] |
| | | const endDate = selected[1] |
| | | const arr = [] |
| | | let i = 0 |
| | | do { |
| | | // å°å¼å§åç»ææ¥æä¹é´çæ¥ææ·»å å°æ°ç»ä¸ |
| | | arr.push(dayjs(startDate).add(i, 'day').format("YYYY-MM-DD")) |
| | | i++ |
| | | // ç´¯å çæ¥æå°äºç»ææ¥ææ¶ï¼ç»§ç»ä¸ä¸æ¬¡çå¾ªç¯ |
| | | } while (dayjs(startDate).add(i, 'day').isBefore(dayjs(endDate))) |
| | | // 为äºä¸æ¬¡æ§ä¿®æ¹æ°ç»ï¼é¿å
computedä¸å¤æ¬¡è§¦åï¼è¿éæç¨arråé䏿¬¡æ§èµå¼çæ¹å¼ï¼åæ¶å°æåä¸ä¸ªæ¥ææ·»å è¿æ¥ |
| | | arr.push(endDate) |
| | | selected = arr |
| | | } else { |
| | | // éæ©åºé´æ¶ï¼åªæä¸ä¸ªæ¥æçæ
åµä¸ï¼ä¸ä¸å
è®¸éæ©èµ·æ¢ä¸ºåä¸å¤©çè¯ï¼ä¸å
è®¸éæ©èªå·± |
| | | if (selected[0] === date && !this.allowSameDay) return |
| | | selected.push(date) |
| | | } |
| | | } |
| | | } |
| | | this.setSelected(selected) |
| | | }, |
| | | // 设置é»è®¤æ¥æ |
| | | setDefaultDate() { |
| | | if (!this.defaultDate) { |
| | | // å¦ææ²¡æè®¾ç½®é»è®¤æ¥æï¼åå°å½å¤©æ¥æè®¾ç½®ä¸ºé»è®¤éä¸çæ¥æ |
| | | const selected = [dayjs().format("YYYY-MM-DD")] |
| | | return this.setSelected(selected, false) |
| | | } |
| | | let defaultDate = [] |
| | | const minDate = this.minDate || dayjs().format("YYYY-MM-DD") |
| | | const maxDate = this.maxDate || dayjs(minDate).add(this.maxMonth - 1, 'month').format("YYYY-MM-DD") |
| | | if (this.mode === 'single') { |
| | | // å鿍¡å¼ï¼å¯ä»¥æ¯åç¬¦ä¸²ææ°ç»ï¼Date对象ç |
| | | if (!uni.$u.test.array(this.defaultDate)) { |
| | | defaultDate = [dayjs(this.defaultDate).format("YYYY-MM-DD")] |
| | | } else { |
| | | defaultDate = [this.defaultDate[0]] |
| | | } |
| | | } else { |
| | | // å¦æä¸ºéæ°ç»ï¼å䏿§è¡ |
| | | if (!uni.$u.test.array(this.defaultDate)) return |
| | | defaultDate = this.defaultDate |
| | | } |
| | | // è¿æ»¤ç¨æ·ä¼ éçé»è®¤æ°ç»ï¼ååºåªå¨å¯å
许æå¤§å¼ä¸æå°å¼ä¹é´çå
ç´ |
| | | defaultDate = defaultDate.filter(item => { |
| | | return dayjs(item).isAfter(dayjs(minDate).subtract(1, 'day')) && dayjs(item).isBefore(dayjs( |
| | | maxDate).add(1, 'day')) |
| | | }) |
| | | this.setSelected(defaultDate, false) |
| | | }, |
| | | setSelected(selected, event = true) { |
| | | this.selected = selected |
| | | event && this.$emit('monthSelected', this.selected) |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | @import "../../libs/css/components.scss"; |
| | | |
| | | .u-calendar-month-wrapper { |
| | | margin-top: 4px; |
| | | } |
| | | |
| | | .u-calendar-month { |
| | | |
| | | &__title { |
| | | font-size: 14px; |
| | | line-height: 42px; |
| | | height: 42px; |
| | | color: $u-main-color; |
| | | text-align: center; |
| | | font-weight: bold; |
| | | } |
| | | |
| | | &__days { |
| | | position: relative; |
| | | @include flex; |
| | | flex-wrap: wrap; |
| | | |
| | | &__month-mark-wrapper { |
| | | position: absolute; |
| | | top: 0; |
| | | bottom: 0; |
| | | left: 0; |
| | | right: 0; |
| | | @include flex; |
| | | justify-content: center; |
| | | align-items: center; |
| | | |
| | | &__text { |
| | | font-size: 155px; |
| | | color: rgba(231, 232, 234, 0.83); |
| | | } |
| | | } |
| | | |
| | | &__day { |
| | | @include flex; |
| | | padding: 2px; |
| | | /* #ifndef APP-NVUE */ |
| | | // vueä¸ä½¿ç¨cssè¿è¡å®½åº¦è®¡ç®ï¼å 为æäºå®åæºä¼æ æ³è¿è¡jsè·åç¶å
ç´ å®½åº¦è¿è¡è®¡ç®å¾åºï¼ä¼æåç§» |
| | | width: calc(100% / 7); |
| | | box-sizing: border-box; |
| | | /* #endif */ |
| | | |
| | | &__select { |
| | | flex: 1; |
| | | @include flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | position: relative; |
| | | |
| | | &__dot { |
| | | width: 7px; |
| | | height: 7px; |
| | | border-radius: 100px; |
| | | background-color: $u-error; |
| | | position: absolute; |
| | | top: 12px; |
| | | right: 7px; |
| | | } |
| | | |
| | | &__buttom-info { |
| | | color: $u-content-color; |
| | | text-align: center; |
| | | position: absolute; |
| | | bottom: 5px; |
| | | font-size: 10px; |
| | | text-align: center; |
| | | left: 0; |
| | | right: 0; |
| | | |
| | | &--selected { |
| | | color: #ffffff; |
| | | } |
| | | |
| | | &--disabled { |
| | | color: #cacbcd; |
| | | } |
| | | } |
| | | |
| | | &__info { |
| | | text-align: center; |
| | | font-size: 16px; |
| | | |
| | | &--selected { |
| | | color: #ffffff; |
| | | } |
| | | |
| | | &--disabled { |
| | | color: #cacbcd; |
| | | } |
| | | } |
| | | |
| | | &--selected { |
| | | background-color: $u-primary; |
| | | @include flex; |
| | | justify-content: center; |
| | | align-items: center; |
| | | flex: 1; |
| | | border-radius: 3px; |
| | | } |
| | | |
| | | &--range-selected { |
| | | opacity: 0.3; |
| | | border-radius: 0; |
| | | } |
| | | |
| | | &--range-start-selected { |
| | | border-top-right-radius: 0; |
| | | border-bottom-right-radius: 0; |
| | | } |
| | | |
| | | &--range-end-selected { |
| | | border-top-left-radius: 0; |
| | | border-bottom-left-radius: 0; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | </style> |