You need to sign in or sign up before continuing.
hookehuyr

✨ feat: 新增日历选择控件

1 +<!--
2 + * @Date: 2022-09-14 11:00:01
3 + * @LastEditors: hookehuyr hookehuyr@gmail.com
4 + * @LastEditTime: 2022-09-14 14:24:41
5 + * @FilePath: /data-table/src/components/CalendarField/index.vue
6 + * @Description: 文件描述
7 +-->
8 +<template>
9 + <div class="calendar-page">
10 + <div class="label">{{ item.label }}<span v-if="item.required">&nbsp;*</span></div>
11 + <van-field v-model="item.value" is-link readonly :name="item.key" :required="item.required"
12 + :placeholder="item.placeholder" :rules="item.rules" @click="show = true" />
13 + <van-calendar v-model:show="show"
14 + :type="item.component_props.type" :max-range="item.component_props.maxRange"
15 + :min-date="item.component_props.minDate" :max-date="item.component_props.maxDate"
16 + :formatter="formatter"
17 + first-day-of-week="1"
18 + @month-show="onMonthShow"
19 + @confirm="onConfirm" allow-same-day />
20 + </div>
21 +</template>
22 +
23 +<script setup>
24 +const props = defineProps({
25 + item: Object
26 +})
27 +
28 +const show = ref(false);
29 +
30 +const formatDate = (date) => `${date.getFullYear()}/${date.getMonth() + 1}/${date.getDate()}`;
31 +const onConfirm = (value) => {
32 + console.warn(props.item.component_props.type);
33 + show.value = false;
34 + if (props.item.component_props.type === 'range') { // 日期区间
35 + const [start, end] = value;
36 + props.item.value = `${formatDate(start)} ~ ${formatDate(end)}`;
37 + } else if (props.item.component_props.type === 'multiple') { // 多个日期
38 + const arr = []
39 + value.forEach(element => {
40 + arr.push(formatDate(element))
41 + });
42 + props.item.value = arr.join(',');
43 + } else {
44 + props.item.value = formatDate(value);
45 + }
46 +};
47 +
48 +// 每一格内容格式化
49 +const formatter = (day) => {
50 + const month = day.date.getMonth() + 1;
51 + const date = day.date.getDate();
52 + const year = day.date.getFullYear();
53 +
54 + if (month === 5) {
55 + if (date === 1) {
56 + day.topInfo = '劳动节';
57 + } else if (date === 4) {
58 + day.topInfo = '青年节';
59 + } else if (date === 11) {
60 + day.text = '今天';
61 + }
62 + }
63 +
64 + if (month === 10) {
65 + if (date === 1) {
66 + day.topInfo = '国庆节';
67 + day.type = 'disabled'
68 + }
69 + }
70 +
71 + if (day.type === 'start') {
72 + day.bottomInfo = '开始';
73 + } else if (day.type === 'end') {
74 + day.bottomInfo = '结束';
75 + }
76 +
77 + return day;
78 +};
79 +
80 +const onMonthShow = ({ date, title }) => {
81 + // console.warn(date);
82 + // console.warn(title);
83 + if (title === '2022年12月') {
84 + }
85 +}
86 +
87 +</script>
88 +
89 +<style lang="less" scoped>
90 +.calendar-page {
91 + .label {
92 + padding: 1rem 1rem 0 1rem;
93 + font-size: 0.9rem;
94 + font-weight: bold;
95 +
96 + span {
97 + color: red;
98 + }
99 + }
100 +}
101 +</style>
...@@ -14,6 +14,7 @@ import PhoneField from '@/components/PhoneField/index.vue' ...@@ -14,6 +14,7 @@ import PhoneField from '@/components/PhoneField/index.vue'
14 import EmailField from '@/components/EmailField/index.vue' 14 import EmailField from '@/components/EmailField/index.vue'
15 import SignField from '@/components/SignField/index.vue' 15 import SignField from '@/components/SignField/index.vue'
16 import RatePickerField from '@/components/RatePickerField/index.vue' 16 import RatePickerField from '@/components/RatePickerField/index.vue'
17 +import CalendarField from '@/components/CalendarField/index.vue'
17 18
18 /** 19 /**
19 * 生成自定义组件类型 20 * 生成自定义组件类型
...@@ -32,6 +33,7 @@ import RatePickerField from '@/components/RatePickerField/index.vue' ...@@ -32,6 +33,7 @@ import RatePickerField from '@/components/RatePickerField/index.vue'
32 * @type email 邮箱输入框 EmailField 33 * @type email 邮箱输入框 EmailField
33 * @type sign 电子签名输入框 SignField 34 * @type sign 电子签名输入框 SignField
34 * @type rate_picker 评分选择器 RatePickerField 35 * @type rate_picker 评分选择器 RatePickerField
36 + * @type calendar 日历选择器 CalendarField
35 */ 37 */
36 export function createComponentType(data) { 38 export function createComponentType(data) {
37 // 判断类型和使用组件 39 // 判断类型和使用组件
...@@ -97,5 +99,9 @@ export function createComponentType(data) { ...@@ -97,5 +99,9 @@ export function createComponentType(data) {
97 item.name = item.key; 99 item.name = item.key;
98 item.component = RatePickerField; 100 item.component = RatePickerField;
99 } 101 }
102 + if (item.component_props.name === 'calendar') {
103 + item.name = item.key;
104 + item.component = CalendarField;
105 + }
100 }) 106 })
101 } 107 }
......
...@@ -2,12 +2,12 @@ ...@@ -2,12 +2,12 @@
2 * @Author: hookehuyr hookehuyr@gmail.com 2 * @Author: hookehuyr hookehuyr@gmail.com
3 * @Date: 2022-05-31 12:06:19 3 * @Date: 2022-05-31 12:06:19
4 * @LastEditors: hookehuyr hookehuyr@gmail.com 4 * @LastEditors: hookehuyr hookehuyr@gmail.com
5 - * @LastEditTime: 2022-09-08 15:47:18 5 + * @LastEditTime: 2022-09-14 11:05:31
6 * @FilePath: /data-table/src/main.js 6 * @FilePath: /data-table/src/main.js
7 * @Description: 7 * @Description:
8 */ 8 */
9 import { createApp } from 'vue'; 9 import { createApp } from 'vue';
10 -import { Button, Image as VanImage, Col, Row, Icon, Form, Field, CellGroup, ConfigProvider, Toast, Uploader, Empty, Tab, Tabs, Overlay, NumberKeyboard, Lazyload, List, PullRefresh, Popup, Picker, Sticky, Stepper, Tag, Swipe, SwipeItem, Dialog, ActionSheet, Loading, Checkbox, Search, NavBar, Collapse, CollapseItem, RadioGroup, Radio, CheckboxGroup, Area, DatePicker, TimePicker, PickerGroup, Rate } from 'vant'; 10 +import { Button, Image as VanImage, Col, Row, Icon, Form, Field, CellGroup, ConfigProvider, Toast, Uploader, Empty, Tab, Tabs, Overlay, NumberKeyboard, Lazyload, List, PullRefresh, Popup, Picker, Sticky, Stepper, Tag, Swipe, SwipeItem, Dialog, ActionSheet, Loading, Checkbox, Search, NavBar, Collapse, CollapseItem, RadioGroup, Radio, CheckboxGroup, Area, DatePicker, TimePicker, PickerGroup, Rate, Calendar } from 'vant';
11 import router from './router'; 11 import router from './router';
12 import App from './App.vue'; 12 import App from './App.vue';
13 // import axios from './utils/axios'; 13 // import axios from './utils/axios';
...@@ -25,6 +25,6 @@ app.config.warnHandler = () => null; ...@@ -25,6 +25,6 @@ app.config.warnHandler = () => null;
25 25
26 app.config.globalProperties.$http = axios; // 关键语句 26 app.config.globalProperties.$http = axios; // 关键语句
27 27
28 -app.use(pinia).use(router).use(Button).use(VanImage).use(Col).use(Row).use(Icon).use(Form).use(Field).use(CellGroup).use(Toast).use(Uploader).use(Empty).use(Tab).use(Tabs).use(Overlay).use(NumberKeyboard).use(Lazyload).use(List).use(PullRefresh).use(Popup).use(Picker).use(Sticky).use(Stepper).use(Tag).use(Swipe).use(SwipeItem).use(Dialog).use(ActionSheet).use(Loading).use(Checkbox).use(Search).use(ConfigProvider).use(NavBar).use(Collapse).use(CollapseItem).use(Radio).use(RadioGroup).use(CheckboxGroup).use(Area).use(DatePicker).use(TimePicker).use(PickerGroup).use(Rate); 28 +app.use(pinia).use(router).use(Button).use(VanImage).use(Col).use(Row).use(Icon).use(Form).use(Field).use(CellGroup).use(Toast).use(Uploader).use(Empty).use(Tab).use(Tabs).use(Overlay).use(NumberKeyboard).use(Lazyload).use(List).use(PullRefresh).use(Popup).use(Picker).use(Sticky).use(Stepper).use(Tag).use(Swipe).use(SwipeItem).use(Dialog).use(ActionSheet).use(Loading).use(Checkbox).use(Search).use(ConfigProvider).use(NavBar).use(Collapse).use(CollapseItem).use(Radio).use(RadioGroup).use(CheckboxGroup).use(Area).use(DatePicker).use(TimePicker).use(PickerGroup).use(Rate).use(Calendar);
29 app.use(vueEsign) 29 app.use(vueEsign)
30 app.mount('#app'); 30 app.mount('#app');
......
1 <!-- 1 <!--
2 * @Date: 2022-07-18 10:22:22 2 * @Date: 2022-07-18 10:22:22
3 * @LastEditors: hookehuyr hookehuyr@gmail.com 3 * @LastEditors: hookehuyr hookehuyr@gmail.com
4 - * @LastEditTime: 2022-09-13 17:46:30 4 + * @LastEditTime: 2022-09-14 14:38:05
5 * @FilePath: /data-table/src/views/index.vue 5 * @FilePath: /data-table/src/views/index.vue
6 * @Description: 首页 6 * @Description: 首页
7 --> 7 -->
...@@ -46,19 +46,34 @@ onMounted(() => { ...@@ -46,19 +46,34 @@ onMounted(() => {
46 // }, 46 // },
47 // required: true, 47 // required: true,
48 // }, 48 // },
49 + // {
50 + // key: 'username',
51 + // value: 'test',
52 + // label: '用户名',
53 + // placeholder: '请输入用户名',
54 + // component: '',
55 + // component_props: {
56 + // name: 'text',
57 + // // readonly: true,
58 + // // disabled: true,
59 + // // align: 'left',
60 + // },
61 + // required: true,
62 + // },
49 { 63 {
50 - key: 'username', 64 + key: 'date',
51 - value: 'test', 65 + value: '',
52 - label: '用户名', 66 + label: '日历选择',
53 - placeholder: '请输入用户名', 67 + placeholder: '请选择日历日期',
54 component: '', 68 component: '',
55 component_props: { 69 component_props: {
56 - name: 'text', 70 + name: 'calendar',
57 - // readonly: true, 71 + type: 'range', // 日期区间 ['multiple', 'range']
58 - // disabled: true, 72 + minDate: new Date(2022, 0, 1), // 最小日期
59 - // align: 'left', 73 + maxDate: new Date(2023, 0, 31), // 最大日期
74 + maxRange: 5, // 最大可选天数
60 }, 75 },
61 - required: true, 76 + required: false,
62 }, 77 },
63 // { 78 // {
64 // key: 'email', 79 // key: 'email',
......