diff --git a/document/common/config/menu.json b/document/common/config/menu.json index b6b1bf57aa4b5af4291bc041a1c9f32a898499d6..6f5708795d044ffc9bec945e747fa0dc429ccaa3 100644 --- a/document/common/config/menu.json +++ b/document/common/config/menu.json @@ -108,6 +108,7 @@ "toast": "Toast", "picker": "Picker", "cascade-picker": "CascadePicker", + "date-picker": "DatePicker", "time-picker": "TimePicker", "dialog": "Dialog", "action-sheet": "ActionSheet" diff --git a/document/components/docs/en-US/cascade-picker.md b/document/components/docs/en-US/cascade-picker.md index 65a0cadfe606f37bd93690eee3750758fa291dc4..7d5842f9d03772a59a5897d01f8cb07c63d3b238 100644 --- a/document/components/docs/en-US/cascade-picker.md +++ b/document/components/docs/en-US/cascade-picker.md @@ -213,7 +213,6 @@ } } ``` - One more thing, although `setData` is available when visible, considering user experience, you can't change the number of columns when the picker is visible. ### Props configuration diff --git a/document/components/docs/zh-CN/cascade-picker.md b/document/components/docs/zh-CN/cascade-picker.md index d7c54dc11fe51b5165dae4434d33618cddf3b89f..b3e79b1c2233e3b1dfb56274e8b5cbad37f90bbb 100644 --- a/document/components/docs/zh-CN/cascade-picker.md +++ b/document/components/docs/zh-CN/cascade-picker.md @@ -204,8 +204,6 @@ } ``` - 值得注意的一点是,虽然不管选择器显示前后,都可以`setData`,但是为了体验,在显示后`setData`,所传入的数据结构,必须与之前的列数相同,也就是说如果之前是三列选择器,显示时`setData`还得是三列。 - ### Props 配置 | 参数 | 说明 | 类型 | 默认值 | 示例 | diff --git a/document/components/docs/zh-CN/date-picker.md b/document/components/docs/zh-CN/date-picker.md new file mode 100644 index 0000000000000000000000000000000000000000..e8f2c674b0b30be56012b316ec37dec929f5c705 --- /dev/null +++ b/document/components/docs/zh-CN/date-picker.md @@ -0,0 +1,207 @@ +## DatePicker 组件 + +日期选择器,可用于日期选择,选择粒度的灵活配置,如年月日、时分秒、年月日时分秒、年月等。 + +### 示例 + +- 基本用法 + + 通过 `$createDatePicker` 创建一个组件实例,配置 `min`、`max` 设定选择的日期范围,还可以通过 `value` 设置当前选择的日期。 + + ```html + Date Picker + ``` + ```js + export default { + mounted () { + this.datePicker = this.$createDatePicker({ + title: 'Date Picker', + min: new Date(2008, 7, 8), + max: new Date(2020, 9, 20), + value: new Date(), + onSelect: this.selectHandle, + onCancel: this.cancelHandle + }) + }, + methods: { + showDatePicker() { + this.datePicker.show() + }, + selectHandle(date, selectedVal, selectedText) { + this.$createDialog({ + type: 'warn', + content: `Selected Item:
- date: ${date}
- value: ${selectedVal.join(', ')}
- text: ${selectedText.join(' ')}`, + icon: 'cubeic-alert' + }).show() + }, + cancelHandle() { + this.$createToast({ + type: 'correct', + txt: 'Picker canceled', + time: 1000 + }).show() + } + } + } + ``` + +- 列的配置 + + `DatePicker` 有一个非常灵活的能力,就是可以配置列,总共是年、月、日、时、分、秒六种的列,你可以通过 `startColumn` 和 `columnCount` 来配置起始列和列数,比如默认的”年月日“选择,是从“年”开始的“三列”,而时分秒,则是从“时”开始的“三列”。 + + ```html + Time Picker + ``` + ```js + export default { + mounted () { + this.timePicker = this.$createDatePicker({ + title: 'Time Picker', + min: new Date(2008, 7, 8, 8, 0, 0), + max: new Date(2008, 7, 8, 20, 59, 59), + value: new Date(2008, 7, 8, 12, 30, 30), + startColumn: 'hour', + onSelect: this.selectHandle, + onCancel: this.cancelHandle + }) + }, + methods: { + showTimePicker() { + this.timePicker.show() + }, + selectHandle(date, selectedVal, selectedText) { + this.$createDialog({ + type: 'warn', + content: `Selected Item:
- date: ${date}
- value: ${selectedVal.join(', ')}
- text: ${selectedText.join(' ')}`, + icon: 'cubeic-alert' + }).show() + }, + cancelHandle() { + this.$createToast({ + type: 'correct', + txt: 'Picker canceled', + time: 1000 + }).show() + } + } + } + ``` + +- 年月日时分秒选择器 + + 同理,如果想要年月日时分秒选择器,则是以“年”开始的六列。 + + ```html + Date Time Picker + ``` + ```js + export default { + mounted () { + this.dateTimePicker = this.$createDatePicker({ + title: 'Date Time Picker', + min: new Date(2008, 7, 8, 8, 0, 0), + max: new Date(2020, 9, 20, 20, 59, 59), + value: new Date(), + columnCount: 6, + onSelect: this.selectHandle, + onCancel: this.cancelHandle + }) + }, + methods: { + showDateTimePicker() { + this.dateTimePicker.show() + }, + selectHandle(date, selectedVal, selectedText) { + this.$createDialog({ + type: 'warn', + content: `Selected Item:
- date: ${date}
- value: ${selectedVal.join(', ')}
- text: ${selectedText.join(' ')}`, + icon: 'cubeic-alert' + }).show() + }, + cancelHandle() { + this.$createToast({ + type: 'correct', + txt: 'Picker canceled', + time: 1000 + }).show() + } + } + } + ``` + +- `$updateProps` + + 通过`$updateProps`方法,可以修改用 createAPI 创建的组件实例的属性。比如 `DatePicker`中,我们可以修改 `value` 属性的值改变当前选择的日期。 + + ```html + Use $updateProps + ``` + ```js + export default { + mounted () { + this.updatePropsPicker = this.$createDatePicker({ + title: 'Use $updateProps', + min: new Date(2008, 7, 8), + max: new Date(2020, 9, 20), + value: new Date(), + onSelect: this.selectHandle, + onCancel: this.cancelHandle + }) + }, + methods: { + showUpdatePropsPicker() { + this.updatePropsPicker.show() + setTimeout(() => { + this.updatePropsPicker.$updateProps({ + title: 'updated', + value: new Date(2010, 9, 1) + }) + }, 1000) + }, + selectHandle(date, selectedVal, selectedText) { + this.$createDialog({ + type: 'warn', + content: `Selected Item:
- date: ${date}
- value: ${selectedVal.join(', ')}
- text: ${selectedText.join(' ')}`, + icon: 'cubeic-alert' + }).show() + }, + cancelHandle() { + this.$createToast({ + type: 'correct', + txt: 'Picker canceled', + time: 1000 + }).show() + } + } + } + ``` + +### Props 配置 + +| 参数 | 说明 | 类型 | 可选值 | 默认值 | 示例 | +| - | - | - | - | - | - | +| min | 可选范围的最小值 | Date, Array | - | new Date(2010, 1, 1) | new Date(2008, 7, 8) | +| max | 可选范围的最大值 | Date, Array | - | new Date(2020, 12, 31) | new Date(2020, 9, 20) | +| value | 当前选择的日期 | Date, Array | - | 可选范围的最小值 | new Date() | +| startColumn | 起始列 | String | year/month/date/hour/minute/second| year | hour | +| columnCount | 列数 | Number | - | 3 | 6 | +| title | 标题 | String | - | '' | - | +| cancelTxt | 取消按钮文案 | String | - | '取消' | - | +| confirmTxt | 确定按钮文案 | String | - | '确定' | - | +| swipeTime | 快速滑动选择器滚轮时,惯性滚动动画的时长,单位:ms | Number | - | 2500 | - | +| alias | 配置`value`和`text`的别名,用法同`Picker`组件 | Object | - | {} | { value: 'id', text: 'name'} | + +### 事件 + +| 事件名 | 说明 | 参数1 | 参数2 | 参数3 | +| - | - | - | - | - | +| select | 点击确认按钮触发此事件 | date: 当前选中日期,Date 类型 | selectedVal: 当前选中项每一列的值,Array 类型 | selectedText: 当前选中项每一列的文案,Array 类型 | +| cancel | 点击取消按钮触发此事件 | - | - | +| change | 滚轴滚动后触发此事件 | index: 当前滚动列次序,Number 类型 | selectedIndex: 当前列选中项的索引,Number 类型 | + +### 实例方法 + +| 方法名 | 说明 | +| - | - | +| show | 显示选择器 | +| hide | 隐藏选择器 | diff --git a/example/App.vue b/example/App.vue index 366d2c722a2541d471202301e925276b506aaf5b..c8bfea88dbaa7afe2d83ba4568fcdc05493a3e01 100644 --- a/example/App.vue +++ b/example/App.vue @@ -96,6 +96,10 @@ path: '/segment-picker', text: 'SegmentPicker' }, + { + path: '/date-picker', + text: 'DatePicker' + }, { path: '/time-picker', text: 'TimePicker' diff --git a/example/pages/date-picker.vue b/example/pages/date-picker.vue new file mode 100644 index 0000000000000000000000000000000000000000..88ba52b29dc1560c90f77d118531a9885c19e0d0 --- /dev/null +++ b/example/pages/date-picker.vue @@ -0,0 +1,112 @@ + + + diff --git a/example/router/routes.js b/example/router/routes.js index a026a79e4a918e60da2cfae0aa73a2fd8f14ee76..8ced66a6ea273736277d6c3de026d2924b936a06 100644 --- a/example/router/routes.js +++ b/example/router/routes.js @@ -16,6 +16,7 @@ import FormCustom from '../pages/form/custom.vue' import Picker from '../pages/picker.vue' import CascadePicker from '../pages/cascade-picker.vue' import SegmentPicker from '../pages/segment-picker.vue' +import DatePicker from '../pages/date-picker.vue' import TimePicker from '../pages/time-picker.vue' import Select from '../pages/select.vue' import Dialog from '../pages/dialog.vue' @@ -106,6 +107,10 @@ const routes = [ path: '/segment-picker', component: SegmentPicker }, + { + path: '/date-picker', + component: DatePicker + }, { path: '/time-picker', component: TimePicker diff --git a/src/common/mixins/basic-picker.js b/src/common/mixins/basic-picker.js new file mode 100644 index 0000000000000000000000000000000000000000..30485bad4ed2510ed6f9d8b2941dd25faf65c7e7 --- /dev/null +++ b/src/common/mixins/basic-picker.js @@ -0,0 +1,43 @@ +const DEFAULT_KEYS = { + value: 'value', + text: 'text' +} + +export default { + props: { + data: { + type: Array, + default() { + return [] + } + }, + selectedIndex: { + type: Array, + default() { + return [] + } + }, + alias: { + type: Object, + default() { + return {} + } + } + }, + computed: { + valueKey() { + return this.alias.value || DEFAULT_KEYS.value + }, + textKey() { + return this.alias.text || DEFAULT_KEYS.text + } + }, + watch: { + data(newVal) { + this.setData(newVal, this.selectedIndex) + }, + selectedIndex(newVal) { + this.setData(this.data, newVal) + } + } +} diff --git a/src/common/mixins/picker.js b/src/common/mixins/picker.js index 7432207d1a8f6b843a66ad27fc5bf9c4c9034d1c..eb45207b485dbe680f7af6d7525212c986cf91c0 100644 --- a/src/common/mixins/picker.js +++ b/src/common/mixins/picker.js @@ -1,22 +1,5 @@ -const DEFAULT_KEYS = { - value: 'value', - text: 'text' -} - export default { props: { - data: { - type: Array, - default() { - return [] - } - }, - selectedIndex: { - type: Array, - default() { - return [] - } - }, title: { type: String }, @@ -32,30 +15,8 @@ export default { type: Number, default: 2500 }, - alias: { - type: Object, - default() { - return {} - } - }, zIndex: { type: Number } - }, - computed: { - valueKey() { - return this.alias.value || DEFAULT_KEYS.value - }, - textKey() { - return this.alias.text || DEFAULT_KEYS.text - } - }, - watch: { - data(newVal) { - this.setData(newVal, this.selectedIndex) - }, - selectedIndex(newVal) { - this.setData(this.data, newVal) - } } } diff --git a/src/components/cascade-picker/cascade-picker.vue b/src/components/cascade-picker/cascade-picker.vue index cdacefd3eab29299aeed1b63d2116aa4afa1cffe..489c806bd9d721c7bdcfdd4391551b851e07d555 100644 --- a/src/components/cascade-picker/cascade-picker.vue +++ b/src/components/cascade-picker/cascade-picker.vue @@ -1,9 +1,9 @@