hookehuyr

✨ feat: 新增日期时间选择控件

1 +<!--
2 + * @Date: 2022-09-08 15:02:45
3 + * @LastEditors: hookehuyr hookehuyr@gmail.com
4 + * @LastEditTime: 2022-09-08 15:18:22
5 + * @FilePath: /data-table/src/components/DateTimePickerField/index.vue
6 + * @Description: 文件描述
7 +-->
8 +<template>
9 + <div class="datetime-picker">
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="showPicker = true" />
13 + <van-popup v-model:show="showPicker" position="bottom">
14 + <van-picker-group :title="item.component_props.title" :tabs="['选择日期', '选择时间']" @confirm="onConfirm"
15 + @cancel="onCancel">
16 + <van-date-picker v-model="currentDate" :min-date="item.component_props.minDate" />
17 + <van-time-picker v-model="currentTime" />
18 + </van-picker-group>
19 + </van-popup>
20 + </div>
21 +</template>
22 +
23 +<script setup>
24 +import { showToast } from 'vant';
25 +import dayjs from 'dayjs';
26 +
27 +const props = defineProps({
28 + item: Object
29 +})
30 +const showPicker = ref(false);
31 +
32 +const currentDate = ref([]);
33 +const currentTime = ref([]);
34 +
35 +const onConfirm = () => {
36 + props.item.value = `${currentDate.value.join('-')} ${currentTime.value.join(':')}`;
37 + showPicker.value = false;
38 +};
39 +const onCancel = () => {
40 + showPicker.value = false;
41 +};
42 +
43 +onMounted(() => {
44 + // 获取值定位显示
45 + const datetime = props.item.value.split(' ');
46 + currentDate.value = datetime[0]?.split('-');
47 + currentTime.value = datetime[1]?.split(':');
48 +})
49 +</script>
50 +
51 +<style lang="less" scoped>
52 +.datetime-picker {
53 +.label {
54 + padding: 1rem 1rem 0 1rem;
55 + font-size: 0.9rem;
56 + font-weight: bold;
57 +
58 + span {
59 + color: red;
60 + }
61 +}
62 +}
63 +</style>
...@@ -8,6 +8,7 @@ import PickerField from '@/components/PickerField/index.vue' ...@@ -8,6 +8,7 @@ import PickerField from '@/components/PickerField/index.vue'
8 import AreaPickerField from '@/components/AreaPickerField/index.vue' 8 import AreaPickerField from '@/components/AreaPickerField/index.vue'
9 import DatePickerField from '@/components/DatePickerField/index.vue' 9 import DatePickerField from '@/components/DatePickerField/index.vue'
10 import TimePickerField from '@/components/TimePickerField/index.vue' 10 import TimePickerField from '@/components/TimePickerField/index.vue'
11 +import DateTimePickerField from '@/components/DateTimePickerField/index.vue'
11 import ImageUploaderField from '@/components/ImageUploaderField/index.vue' 12 import ImageUploaderField from '@/components/ImageUploaderField/index.vue'
12 import PhoneField from '@/components/PhoneField/index.vue' 13 import PhoneField from '@/components/PhoneField/index.vue'
13 import EmailField from '@/components/EmailField/index.vue' 14 import EmailField from '@/components/EmailField/index.vue'
...@@ -24,6 +25,7 @@ import SignField from '@/components/SignField/index.vue' ...@@ -24,6 +25,7 @@ import SignField from '@/components/SignField/index.vue'
24 * @type area_picker 地址选择器 AreaPickerField 25 * @type area_picker 地址选择器 AreaPickerField
25 * @type date_picker 日期选择器 DatePickerField 26 * @type date_picker 日期选择器 DatePickerField
26 * @type time_picker 时间选择器 TimePickerField 27 * @type time_picker 时间选择器 TimePickerField
28 + * @type datetime_picker 日期时间选择器 DateTimePickerField
27 * @type image_uploader 图片上传 ImageUploaderField 29 * @type image_uploader 图片上传 ImageUploaderField
28 * @type phone 手机输入框 PhoneField 30 * @type phone 手机输入框 PhoneField
29 * @type email 邮箱输入框 EmailField 31 * @type email 邮箱输入框 EmailField
...@@ -71,6 +73,9 @@ export function createComponentType(data) { ...@@ -71,6 +73,9 @@ export function createComponentType(data) {
71 if (item.component_props.name === 'time_picker') { 73 if (item.component_props.name === 'time_picker') {
72 item.component = TimePickerField; 74 item.component = TimePickerField;
73 } 75 }
76 + if (item.component_props.name === 'datetime_picker') {
77 + item.component = DateTimePickerField;
78 + }
74 if (item.component_props.name === 'image_uploader') { 79 if (item.component_props.name === 'image_uploader') {
75 item.component = ImageUploaderField; 80 item.component = ImageUploaderField;
76 } 81 }
......
...@@ -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 10:05:14 5 + * @LastEditTime: 2022-09-08 15:06:26
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 } 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 } 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); 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);
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-08 14:31:33 4 + * @LastEditTime: 2022-09-08 15:22:09
5 * @FilePath: /data-table/src/views/index.vue 5 * @FilePath: /data-table/src/views/index.vue
6 * @Description: 首页 6 * @Description: 首页
7 --> 7 -->
...@@ -172,7 +172,7 @@ onMounted(() => { ...@@ -172,7 +172,7 @@ onMounted(() => {
172 // }, 172 // },
173 // }, 173 // },
174 // { 174 // {
175 - // key: 'datetime', 175 + // key: 'date',
176 // value: '2022-10', 176 // value: '2022-10',
177 // label: '日期选择', 177 // label: '日期选择',
178 // placeholder: '请选择日期', 178 // placeholder: '请选择日期',
...@@ -205,6 +205,18 @@ onMounted(() => { ...@@ -205,6 +205,18 @@ onMounted(() => {
205 // multiple: false 205 // multiple: false
206 // } 206 // }
207 // } 207 // }
208 + {
209 + key: 'datetime',
210 + value: '2022-06-01 12:00',
211 + label: '日期时间',
212 + placeholder: '请选择日期时间',
213 + component_props: {
214 + name: 'datetime_picker',
215 + title: '请选择',
216 + minDate: new Date(),
217 + },
218 + required: true,
219 + }
208 ]; 220 ];
209 // 生成自定义组件 221 // 生成自定义组件
210 createComponentType(mockData.value) 222 createComponentType(mockData.value)
......