[new feature] DatetimePicker: add new prop formatter & add new external classes

fix #1526
This commit is contained in:
rex 2019-04-24 01:24:10 +08:00 committed by GitHub
parent b8683f61a9
commit f0e38b2720
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 64 additions and 17 deletions

View File

@ -11,7 +11,15 @@ Page({
currentDate2: null, currentDate2: null,
currentDate3: new Date(2018, 0, 1), currentDate3: new Date(2018, 0, 1),
currentDate4: '12:00', currentDate4: '12:00',
loading: false loading: false,
formatter(type, value) {
if (type === 'year') {
return `${value}`;
} else if (type === 'month') {
return `${value}`;
}
return value;
}
}, },
onInput(event) { onInput(event) {

View File

@ -16,6 +16,7 @@
value="{{ currentDate2 }}" value="{{ currentDate2 }}"
min-date="{{ minDate }}" min-date="{{ minDate }}"
bind:input="onInput" bind:input="onInput"
formatter="{{ formatter }}"
/> />
</demo-block> </demo-block>

View File

@ -54,14 +54,15 @@ Page({
#### 选择日期(年月日) #### 选择日期(年月日)
`value` 为时间戳 `value` 为时间戳,通过传入 `formatter` 函数对选项文字进行处理
```html ```html
<van-datetime-picker <van-datetime-picker
type="date" type="date"
value="{{ currentDate }}" value="{{ currentDate }}"
min-date="{{ minDate }}"
bind:input="onInput" bind:input="onInput"
min-date="{{ minDate }}"
formatter="{{ formatter }}"
/> />
``` ```
@ -69,7 +70,15 @@ Page({
Page({ Page({
data: { data: {
currentDate: new Date().getTime(), currentDate: new Date().getTime(),
minDate: new Date().getTime() minDate: new Date().getTime(),
formatter(type, value) {
if (type === 'year') {
return `${value}年`;
} else if (type === 'month') {
return `${value}月`;
}
return value;
}
}, },
onInput(event) { onInput(event) {
@ -150,6 +159,7 @@ Page({
| max-hour | 可选的最大小时,针对 time 类型 | `Number` | `23` | | max-hour | 可选的最大小时,针对 time 类型 | `Number` | `23` |
| min-minute | 可选的最小分钟,针对 time 类型 | `Number` | `0` | | min-minute | 可选的最小分钟,针对 time 类型 | `Number` | `0` |
| max-minute | 可选的最大分钟,针对 time 类型 | `Number` | `59` | | max-minute | 可选的最大分钟,针对 time 类型 | `Number` | `59` |
| formatter | 选项格式化函数 | `(type, value) => value` | - |
| title | 顶部栏标题 | `String` | `''` | | title | 顶部栏标题 | `String` | `''` |
| show-toolbar | 是否显示顶部栏 | `Boolean` | `false` | | show-toolbar | 是否显示顶部栏 | `Boolean` | `false` |
| loading | 是否显示加载状态 | `Boolean` | `false` | | loading | 是否显示加载状态 | `Boolean` | `false` |
@ -179,3 +189,11 @@ Page({
| setColumnValues(index, values) | 设置对应列中所有的备选值 | | setColumnValues(index, values) | 设置对应列中所有的备选值 |
| getValues() | 获取所有列中被选中的值,返回一个数组 | | getValues() | 获取所有列中被选中的值,返回一个数组 |
| setValues(values) | `values`为一个数组,设置所有列中被选中的值 | | setValues(values) | `values`为一个数组,设置所有列中被选中的值 |
### 外部样式类
| 类名 | 说明 |
|-----------|-----------|
| active-class | 选中项样式类 |
| toolbar-class | 顶部栏样式类 |
| column-class | 列样式类 |

View File

@ -38,9 +38,17 @@ function getMonthEndDay(year: number, month: number): number {
return 32 - new Date(year, month - 1, 32).getDate(); return 32 - new Date(year, month - 1, 32).getDate();
} }
const defaultFormatter = (_, value) => value;
VantComponent({ VantComponent({
classes: ['active-class', 'toolbar-class', 'column-class'],
props: { props: {
...pickerProps, ...pickerProps,
formatter: {
type: Function,
value: defaultFormatter
},
value: null, value: null,
type: { type: {
type: String, type: String,
@ -102,7 +110,9 @@ VantComponent({
methods: { methods: {
getPicker() { getPicker() {
if (this.picker == null) { if (this.picker == null) {
const picker = this.picker = this.selectComponent('.van-datetime-picker'); const picker = (this.picker = this.selectComponent(
'.van-datetime-picker'
));
const { setColumnValues } = picker; const { setColumnValues } = picker;
picker.setColumnValues = (...args: any) => picker.setColumnValues = (...args: any) =>
setColumnValues.apply(picker, [...args, false]); setColumnValues.apply(picker, [...args, false]);
@ -111,11 +121,12 @@ VantComponent({
}, },
updateColumns() { updateColumns() {
const { formatter = defaultFormatter } = this.data;
const results = this.getRanges().map(({ type, range }, index) => { const results = this.getRanges().map(({ type, range }, index) => {
const values = times(range[1] - range[0] + 1, index => { const values = times(range[1] - range[0] + 1, index => {
let value = range[0] + index; let value = range[0] + index;
value = type === 'year' ? `${value}` : padZero(value); value = type === 'year' ? `${value}` : padZero(value);
return value; return formatter(type, value);
}); });
return { values }; return { values };
@ -292,23 +303,29 @@ VantComponent({
updateColumnValue(value) { updateColumnValue(value) {
let values = []; let values = [];
const { data } = this; const { type, formatter = defaultFormatter } = this.data;
const picker = this.getPicker(); const picker = this.getPicker();
if (data.type === 'time') { if (type === 'time') {
const pair = value.split(':'); const pair = value.split(':');
values = [pair[0], pair[1]]; values = [
formatter('hour', pair[0]),
formatter('minute', pair[1])
];
} else { } else {
const date = new Date(value); const date = new Date(value);
values = [`${date.getFullYear()}`, padZero(date.getMonth() + 1)]; values = [
if (data.type === 'date') { formatter('year', `${date.getFullYear()}`),
values.push(padZero(date.getDate())); formatter('month', padZero(date.getMonth() + 1))
];
if (type === 'date') {
values.push(formatter('day', padZero(date.getDate())));
} }
if (data.type === 'datetime') { if (type === 'datetime') {
values.push( values.push(
padZero(date.getDate()), formatter('day', padZero(date.getDate())),
padZero(date.getHours()), formatter('hour', padZero(date.getHours())),
padZero(date.getMinutes()) formatter('minute', padZero(date.getMinutes()))
); );
} }
} }

View File

@ -1,5 +1,8 @@
<van-picker <van-picker
class="van-datetime-picker" class="van-datetime-picker"
active-class="active-class"
toolbar-class="toolbar-class"
column-class="column-class"
title="{{ title }}" title="{{ title }}"
columns="{{ columns }}" columns="{{ columns }}"
item-height="{{ itemHeight }}" item-height="{{ itemHeight }}"

View File

@ -3,11 +3,11 @@
.van-picker-column { .van-picker-column {
overflow: hidden; overflow: hidden;
font-size: 16px; font-size: 16px;
color: @gray-dark;
text-align: center; text-align: center;
&__item { &__item {
padding: 0 5px; padding: 0 5px;
color: @gray-dark;
&--selected { &--selected {
font-weight: 500; font-weight: 500;