Calendar 
组件类型:UxCalendarComponentPublicInstance
支持农历显示、节假日显示、单选、多选、拖拽范围选择模式
平台兼容性 
UniApp X 
| Android | iOS | web | 鸿蒙 Next | 小程序 | 
|---|---|---|---|---|
| √ | √ | √ | √ | √ | 
UniApp Vue Nvue 
| Android | iOS | web | 鸿蒙 Next | 小程序 | 
|---|---|---|---|---|
| x | x | √ | x | x | 
Props 
| 属性名 | 类型 | 默认值 | 说明 | 
|---|---|---|---|
| format | String | 格式化规则 | |
| value | Array | [now] | 值 | 
| range | Array | 范围(例如['2000-01-01','2023-12-10']) | |
| selectMode | String | single | 选择模式 | 
| lunar | Boolean | true | 显示农历 | 
| holiday | Boolean | true | 显示节日 | 
| touchable | Boolean | false | 滑动翻页 | 
| theme | String | $ux.Conf.primaryColor | 主题 | 
| color | String | 颜色优先级高于主题 | |
| background | String | $ux.Conf.backgroundColor | 背景色 | 
| backgroundDark | String | 深色none-不显示,auto-自动适配深色模式,其他-颜色 | |
| showToday | Boolean | false | 显示今日按钮 | 
| disabled | Boolean | false | 是否禁用 | 
selectMode 
| 值 | 说明 | 
|---|---|
| single单选 | |
| muti多选 | |
| range范围 | 
lunar 
| 值 | 说明 | 
|---|---|
| true | |
| false | 
holiday 
| 值 | 说明 | 
|---|---|
| true | |
| false | 
touchable 
| 值 | 说明 | 
|---|---|
| true | |
| false | 
backgroundDark 
| 值 | 说明 | 
|---|---|
| none不显示 | |
| auto自动适配深色模式 | |
| color其他颜色 | 
showToday 
| 值 | 说明 | 
|---|---|
| true | |
| false | 
Events 
| 事件名 | 说明 | 参数 | 
|---|---|---|
| click | 点击时触发 | |
| change | 确定选择时触发 | 
示例代码 
html
<template>
	<ux-page :stack="showDoc">
		<ux-navbar :title="title" :bold="true">
			<template v-slot:right>
				<!-- #ifndef MP -->
				<ux-button theme="text" icon="/static/tip.png" :icon-size="22" @click="onDoc()"></ux-button>
				<!-- #endif -->
			</template>
		</ux-navbar>
		
		<ux-scroll v-if="isOk" :disabled="moving">
			<ux-card direction="column" icon="flag-filled" title="日历" :bold="true">
				<ux-text text="支持农历显示、节假日显示、单选、多选、手指触摸/鼠标拖动范围选择模式"></ux-text>
			</ux-card>
			
			<ux-card>
				<ux-calendar :value="defaults" :range="ranges" :lunar="lunar" :touchable="touchable" :select-mode="mode" :disabled="disabled" format="yyyy年MM月dd日 周" @change="change" @touchstart="touchstart" @touchend="touchend"></ux-calendar>
			</ux-card>
			
			<ux-card direction="column" icon="arrowright" title="参数" :bold="true">
				<ux-text text="支持主题配置、农历显示、滑动翻屏、多选、范围选择、日期范围限制、禁用" :mb="15"></ux-text>
				<ux-col>
					<ux-row>
						<ux-text text="农历显示"></ux-text>
						<ux-switch :checked="lunar" @change="lunarChange"></ux-switch>
						
						<ux-text :ml="20" text="滑动翻屏"></ux-text>
						<ux-switch :checked="touchable" @change="touchableChange"></ux-switch>
					</ux-row>
					
					<ux-row :mt="10">
						<ux-text text="日期多选"></ux-text>
						<ux-switch :checked="muti" @change="mutiChange"></ux-switch>
						
						<ux-text :ml="20" text="范围选择"></ux-text>
						<ux-switch :checked="range" @change="rangeChange"></ux-switch>
					</ux-row>
					
					<ux-row :mt="10">
						<ux-text text="范围限制"></ux-text>
						<ux-switch :checked="rangeLimit" @change="rangeLimitChange"></ux-switch>
						
						<ux-text :ml="20" text="禁用组件"></ux-text>
						<ux-switch :checked="disabled" @change="disabledChange"></ux-switch>
					</ux-row>
				</ux-col>
			</ux-card>
			
			<ux-card icon="arrowright" title="查看日期" :bold="true">
				<ux-text :margin="[10]" v-for="(date, i) in value" :key="i" :text="date.fullDate"></ux-text>
			</ux-card>
			
			<ux-placeholder :height="200">
				<ux-row justify="center" align="center" style="height: 100%;">
					<ux-text prefix-icon="soapbubble-filled" text="真的没有了~"></ux-text>
				</ux-row>
			</ux-placeholder>
		</ux-scroll>
	</ux-page>
</template><template>
	<ux-page :stack="showDoc">
		<ux-navbar :title="title" :bold="true">
			<template v-slot:right>
				<!-- #ifndef MP -->
				<ux-button theme="text" icon="/static/tip.png" :icon-size="22" @click="onDoc()"></ux-button>
				<!-- #endif -->
			</template>
		</ux-navbar>
		
		<ux-scroll v-if="isOk" :disabled="moving">
			<ux-card direction="column" icon="flag-filled" title="日历" :bold="true">
				<ux-text text="支持农历显示、节假日显示、单选、多选、手指触摸/鼠标拖动范围选择模式"></ux-text>
			</ux-card>
			
			<ux-card>
				<ux-calendar :value="defaults" :range="ranges" :lunar="lunar" :touchable="touchable" :select-mode="mode" :disabled="disabled" format="yyyy年MM月dd日 周" @change="change" @touchstart="touchstart" @touchend="touchend"></ux-calendar>
			</ux-card>
			
			<ux-card direction="column" icon="arrowright" title="参数" :bold="true">
				<ux-text text="支持主题配置、农历显示、滑动翻屏、多选、范围选择、日期范围限制、禁用" :mb="15"></ux-text>
				<ux-col>
					<ux-row>
						<ux-text text="农历显示"></ux-text>
						<ux-switch :checked="lunar" @change="lunarChange"></ux-switch>
						
						<ux-text :ml="20" text="滑动翻屏"></ux-text>
						<ux-switch :checked="touchable" @change="touchableChange"></ux-switch>
					</ux-row>
					
					<ux-row :mt="10">
						<ux-text text="日期多选"></ux-text>
						<ux-switch :checked="muti" @change="mutiChange"></ux-switch>
						
						<ux-text :ml="20" text="范围选择"></ux-text>
						<ux-switch :checked="range" @change="rangeChange"></ux-switch>
					</ux-row>
					
					<ux-row :mt="10">
						<ux-text text="范围限制"></ux-text>
						<ux-switch :checked="rangeLimit" @change="rangeLimitChange"></ux-switch>
						
						<ux-text :ml="20" text="禁用组件"></ux-text>
						<ux-switch :checked="disabled" @change="disabledChange"></ux-switch>
					</ux-row>
				</ux-col>
			</ux-card>
			
			<ux-card icon="arrowright" title="查看日期" :bold="true">
				<ux-text :margin="[10]" v-for="(date, i) in value" :key="i" :text="date.fullDate"></ux-text>
			</ux-card>
			
			<ux-placeholder :height="200">
				<ux-row justify="center" align="center" style="height: 100%;">
					<ux-text prefix-icon="soapbubble-filled" text="真的没有了~"></ux-text>
				</ux-row>
			</ux-placeholder>
		</ux-scroll>
	</ux-page>
</template>ts
<script setup>
	import * as plus from '@/uni_modules/ux-plus'
	import { UxCalendarEvent, UxCalendarDate, UxSwitchEvent } from '@/uni_modules/ux-frame'
	
	const title = ref('')
	const value = ref<UxCalendarDate[]>([] as UxCalendarDate[])
	const ranges = ref<string[]>([] as string[])
	const defaults = ref<string[]>(['2023-12-15', '2023-12-30'] as string[])
	const lunar = ref(true)
	const touchable = ref(true)
	const muti = ref(false)
	const range = ref(false)
	const rangeLimit = ref(false)
	const disabled = ref(false)
	const moving = ref(false)
	const isOk = ref(false)
	const showDoc = ref(false)
	const showModal = ref(true)
	
	function onDoc() {
		plus.openWeb({
			title: '在线文档',
			url: 'https://www.uxframe.cn/component/calendar.html',
			// blur: 1,
			success: () => {
				showDoc.value = true
			},
			complete: () => {
				showDoc.value = false
			}
		})
	}
	
	onLoad((e) => {
		title.value = e['title'] ?? ''
		
		setTimeout(function() {
			isOk.value = true
			showModal.value = true
		}, 100);
	})
	
	const mode = computed(():string => {
		if(muti.value) return 'muti'
		
		if(range.value) return 'range'
		
		return 'normal'
	})
	
	function change(e: UxCalendarEvent) {
		value.value = e.value
	}
	
	function lunarChange(e: UxSwitchEvent) {
		lunar.value = e.value
	}
	
	function touchableChange(e: UxSwitchEvent) {
		touchable.value = e.value
		
		if(touchable.value) {
			range.value = false
		}
	}
	
	function mutiChange(e: UxSwitchEvent) {
		muti.value = e.value
		
		if(muti.value) {
			range.value = false
			touchable.value = true
		}
	}
	
	function rangeChange(e: UxSwitchEvent) {
		range.value = e.value
		
		if(range.value) {
			muti.value = false
			touchable.value = false
		}
	}
	
	function rangeLimitChange(e: UxSwitchEvent) {
		rangeLimit.value = e.value
		
		ranges.value = rangeLimit.value ? ['2023-12-04', '2023-12-20'] : []
	}
	
	function disabledChange(e: UxSwitchEvent) {
		disabled.value = e.value
	}
	
	function touchstart() {
		moving.value = true
	}
	
	function touchend() {
		moving.value = false
	}
</script><script setup>
	import * as plus from '@/uni_modules/ux-plus'
	import { UxCalendarEvent, UxCalendarDate, UxSwitchEvent } from '@/uni_modules/ux-frame'
	
	const title = ref('')
	const value = ref<UxCalendarDate[]>([] as UxCalendarDate[])
	const ranges = ref<string[]>([] as string[])
	const defaults = ref<string[]>(['2023-12-15', '2023-12-30'] as string[])
	const lunar = ref(true)
	const touchable = ref(true)
	const muti = ref(false)
	const range = ref(false)
	const rangeLimit = ref(false)
	const disabled = ref(false)
	const moving = ref(false)
	const isOk = ref(false)
	const showDoc = ref(false)
	const showModal = ref(true)
	
	function onDoc() {
		plus.openWeb({
			title: '在线文档',
			url: 'https://www.uxframe.cn/component/calendar.html',
			// blur: 1,
			success: () => {
				showDoc.value = true
			},
			complete: () => {
				showDoc.value = false
			}
		})
	}
	
	onLoad((e) => {
		title.value = e['title'] ?? ''
		
		setTimeout(function() {
			isOk.value = true
			showModal.value = true
		}, 100);
	})
	
	const mode = computed(():string => {
		if(muti.value) return 'muti'
		
		if(range.value) return 'range'
		
		return 'normal'
	})
	
	function change(e: UxCalendarEvent) {
		value.value = e.value
	}
	
	function lunarChange(e: UxSwitchEvent) {
		lunar.value = e.value
	}
	
	function touchableChange(e: UxSwitchEvent) {
		touchable.value = e.value
		
		if(touchable.value) {
			range.value = false
		}
	}
	
	function mutiChange(e: UxSwitchEvent) {
		muti.value = e.value
		
		if(muti.value) {
			range.value = false
			touchable.value = true
		}
	}
	
	function rangeChange(e: UxSwitchEvent) {
		range.value = e.value
		
		if(range.value) {
			muti.value = false
			touchable.value = false
		}
	}
	
	function rangeLimitChange(e: UxSwitchEvent) {
		rangeLimit.value = e.value
		
		ranges.value = rangeLimit.value ? ['2023-12-04', '2023-12-20'] : []
	}
	
	function disabledChange(e: UxSwitchEvent) {
		disabled.value = e.value
	}
	
	function touchstart() {
		moving.value = true
	}
	
	function touchend() {
		moving.value = false
	}
</script>css
<style lang="scss">
</style><style lang="scss">
</style>