[improvement] rename packages dir to src (#3659)

This commit is contained in:
neverland
2019-06-27 11:25:57 +08:00
committed by GitHub
parent 8489918dca
commit 75c79b7044
619 changed files with 21 additions and 21 deletions
+103
View File
@@ -0,0 +1,103 @@
<template>
<demo-section>
<demo-block :title="$t('title1')">
<van-datetime-picker
v-model="currentDate1"
type="datetime"
:min-date="minDate"
:max-date="maxDate"
/>
</demo-block>
<demo-block :title="$t('title2')">
<van-datetime-picker
v-model="currentDate2"
type="date"
:min-date="minDate"
/>
</demo-block>
<demo-block :title="$t('title3')">
<van-datetime-picker
v-model="currentDate3"
type="year-month"
:min-date="minDate"
:formatter="formatter"
/>
</demo-block>
<demo-block :title="$t('title4')">
<van-datetime-picker
v-model="currentTime1"
type="time"
:min-hour="10"
:max-hour="20"
/>
</demo-block>
<demo-block :title="$t('optionFilter')">
<van-datetime-picker
v-model="currentTime2"
type="time"
:filter="filter"
/>
</demo-block>
</demo-section>
</template>
<script>
export default {
i18n: {
'zh-CN': {
title1: '选择完整时间',
title2: '选择日期(年月日)',
title3: '选择日期(年月)',
title4: '选择时间',
year: '年',
month: '月',
optionFilter: '选项过滤器'
},
'en-US': {
title1: 'Choose DateTime',
title2: 'Choose Date',
title3: 'Choose Year-Month',
title4: 'Choose Time',
year: ' Year',
month: ' Month',
optionFilter: 'Option Filter'
}
},
data() {
return {
minDate: new Date(2018, 0, 1),
maxDate: new Date(2019, 10, 1),
currentDate1: new Date(2018, 0, 1),
currentDate2: null,
currentDate3: new Date(2018, 0, 1),
currentTime1: '12:00',
currentTime2: '12:00',
};
},
methods: {
formatter(type, value) {
if (type === 'year') {
return value + this.$t('year');
}
if (type === 'month') {
return value + this.$t('month');
}
return value;
},
filter(type, values) {
if (type === 'minute') {
return values.filter(value => value % 5 === 0);
}
return values;
}
}
};
</script>
+172
View File
@@ -0,0 +1,172 @@
# DatetimePicker
### Intro
The DatetimePicker component is usually used with [Popup](#/en-US/popup) Component.
### Install
``` javascript
import { DatetimePicker } from 'vant';
Vue.use(DatetimePicker);
```
## Usage
### Choose DateTime
```html
<van-datetime-picker
v-model="currentDate"
type="datetime"
:min-date="minDate"
:max-date="maxDate"
/>
```
```javascript
export default {
data() {
return {
minHour: 10,
maxHour: 20,
minDate: new Date(),
maxDate: new Date(2019, 10, 1),
currentDate: new Date()
};
}
};
```
### Choose Date
```html
<van-datetime-picker
v-model="currentDate"
type="date"
:min-date="minDate"
/>
```
```js
export default {
data() {
return {
currentDate: new Date()
};
}
}
```
### Choose Year-Month
```html
<van-datetime-picker
v-model="currentDate"
type="year-month"
:min-date="minDate"
:formatter="formatter"
/>
```
```js
export default {
data() {
return {
currentDate: new Date()
};
},
methods: {
formatter(type, value) {
if (type === 'year') {
return `${value} Year`;
} else if (type === 'month') {
return `${value} Month`
}
return value;
}
}
}
```
### Choose Time
```html
<van-datetime-picker
v-model="currentTime"
type="time"
:min-hour="10"
:max-hour="20"
/>
```
```js
export default {
data() {
return {
currentTime: '12:00'
};
}
}
```
### Option Filter
```html
<van-datetime-picker
v-model="currentTime"
type="time"
:filter="filter"
/>
```
```js
export default {
data() {
return {
currentTime: '12:00'
};
},
methods: {
filter(type, options) {
if (type === 'minute') {
return options.filter(option => option % 5 === 0)
}
return options;
}
}
}
```
## API
### Props
| Attribute | Description | Type | Default |
|------|------|------|------|------|
| type | Can be set to `date` `time`<br> `year-month` | `String` | `datetime` |
| min-date | Min date | `Date` | Ten years ago on January 1 |
| max-date | Max date | `Date` | Ten years later on December 31 |
| min-hour | Min hour for `time` type | `Number` | `0` |
| max-hour | Max hour for `time` type | `Number` | `23` |
| min-minute | Max minute for `time` type | `Number` | `0` |
| max-minute | Max minute for `time` type | `Number` | `59` |
| filter | Option filter | `(type, values) => values` | - |
| formatter | Option text formatter | `(type, value) => value` | - |
| title | Toolbar title | `String` | `''` |
| loading | Whether to show loading prompt | `Boolean` | `false` |
| item-height | Option height | `Number` | `44` |
| confirm-button-text | Text of confirm button | `String` | `Confirm` |
| cancel-button-text | Text of cancel button | `String` | `Cancel` |
| visible-item-count | Count of visible columns | `Number` | `5` |
### Events
| Event | Description | Arguments |
|------|------|------|
| change | Triggered when value changed | picker: picker instance |
| confirm | Triggered when click confirm button | value: current value |
| cancel | Triggered when click cancel button | - |
+327
View File
@@ -0,0 +1,327 @@
import { createNamespace } from '../utils';
import { range } from '../utils/format/number';
import { padZero } from '../utils/format/string';
import Picker from '../picker';
import { pickerProps } from '../picker/shared';
import {
times,
isValidDate,
getTrueValue,
getMonthEndDay
} from './utils';
const [createComponent, bem] = createNamespace('datetime-picker');
const currentYear = new Date().getFullYear();
export default createComponent({
props: {
...pickerProps,
value: null,
filter: Function,
minHour: Number,
minMinute: Number,
type: {
type: String,
default: 'datetime'
},
showToolbar: {
type: Boolean,
default: true
},
format: {
type: String,
default: 'YYYY.MM.DD HH时 mm分'
},
formatter: {
type: Function,
default: (type, value) => value
},
minDate: {
type: Date,
default: () => new Date(currentYear - 10, 0, 1),
validator: isValidDate
},
maxDate: {
type: Date,
default: () => new Date(currentYear + 10, 11, 31),
validator: isValidDate
},
maxHour: {
type: Number,
default: 23
},
maxMinute: {
type: Number,
default: 59
}
},
data() {
return {
innerValue: this.correctValue(this.value)
};
},
watch: {
value(val) {
val = this.correctValue(val);
const isEqual =
this.type === 'time'
? val === this.innerValue
: val.valueOf() === this.innerValue.valueOf();
if (!isEqual) {
this.innerValue = val;
if (this.type === 'time') {
this.updateColumnValue(val);
}
}
},
innerValue(val) {
this.$emit('input', val);
},
columns() {
this.updateColumnValue(this.innerValue);
}
},
computed: {
ranges() {
if (this.type === 'time') {
return [
{
type: 'hour',
range: [this.minHour, this.maxHour]
},
{
type: 'minute',
range: [this.minMinute, this.maxMinute]
}
];
}
const {
maxYear,
maxDate,
maxMonth,
maxHour,
maxMinute
} = this.getBoundary('max', this.innerValue);
const {
minYear,
minDate,
minMonth,
minHour,
minMinute
} = this.getBoundary('min', this.innerValue);
const result = [
{
type: 'year',
range: [minYear, maxYear]
},
{
type: 'month',
range: [minMonth, maxMonth]
},
{
type: 'day',
range: [minDate, maxDate]
},
{
type: 'hour',
range: [minHour, maxHour]
},
{
type: 'minute',
range: [minMinute, maxMinute]
}
];
if (this.type === 'date') result.splice(3, 2);
if (this.type === 'year-month') result.splice(2, 3);
return result;
},
columns() {
const results = this.ranges.map(({ type, range: rangeArr }) => {
let values = times(rangeArr[1] - rangeArr[0] + 1, index => {
const value = padZero(rangeArr[0] + index);
return this.formatter(type, value);
});
if (this.filter) {
values = this.filter(type, values);
}
return {
values
};
});
return results;
}
},
mounted() {
this.updateColumnValue(this.innerValue);
},
methods: {
correctValue(value) {
// validate value
const isDateType = this.type !== 'time';
if (isDateType && !isValidDate(value)) {
value = this.minDate;
} else if (!value) {
value = `${padZero(this.minHour)}:00`;
}
// time type
if (!isDateType) {
let [hour, minute] = value.split(':');
hour = padZero(range(hour, this.minHour, this.maxHour));
minute = padZero(range(minute, this.minMinute, this.maxMinute));
return `${hour}:${minute}`;
}
// date type
value = Math.max(value, this.minDate.getTime());
value = Math.min(value, this.maxDate.getTime());
return new Date(value);
},
getBoundary(type, value) {
const boundary = this[`${type}Date`];
const year = boundary.getFullYear();
let month = 1;
let date = 1;
let hour = 0;
let minute = 0;
if (type === 'max') {
month = 12;
date = getMonthEndDay(value.getFullYear(), value.getMonth() + 1);
hour = 23;
minute = 59;
}
if (value.getFullYear() === year) {
month = boundary.getMonth() + 1;
if (value.getMonth() + 1 === month) {
date = boundary.getDate();
if (value.getDate() === date) {
hour = boundary.getHours();
if (value.getHours() === hour) {
minute = boundary.getMinutes();
}
}
}
}
return {
[`${type}Year`]: year,
[`${type}Month`]: month,
[`${type}Date`]: date,
[`${type}Hour`]: hour,
[`${type}Minute`]: minute
};
},
onConfirm() {
this.$emit('confirm', this.innerValue);
},
onChange(picker) {
let value;
if (this.type === 'time') {
const indexes = picker.getIndexes();
value = `${indexes[0] + this.minHour}:${indexes[1] + this.minMinute}`;
} else {
const values = picker.getValues();
const year = getTrueValue(values[0]);
const month = getTrueValue(values[1]);
const maxDate = getMonthEndDay(year, month);
let date = getTrueValue(values[2]);
if (this.type === 'year-month') {
date = 1;
}
date = date > maxDate ? maxDate : date;
let hour = 0;
let minute = 0;
if (this.type === 'datetime') {
hour = getTrueValue(values[3]);
minute = getTrueValue(values[4]);
}
value = new Date(year, month - 1, date, hour, minute);
}
this.innerValue = this.correctValue(value);
this.$nextTick(() => {
this.$nextTick(() => {
this.$emit('change', picker);
});
});
},
updateColumnValue(value) {
let values = [];
const { formatter } = this;
if (this.type === 'time') {
const pair = value.split(':');
values = [formatter('hour', pair[0]), formatter('minute', pair[1])];
} else {
values = [
formatter('year', `${value.getFullYear()}`),
formatter('month', padZero(value.getMonth() + 1)),
formatter('day', padZero(value.getDate()))
];
if (this.type === 'datetime') {
values.push(
formatter('hour', padZero(value.getHours())),
formatter('minute', padZero(value.getMinutes()))
);
}
if (this.type === 'year-month') {
values = values.slice(0, 2);
}
}
this.$nextTick(() => {
this.$refs.picker.setValues(values);
});
}
},
render(h) {
const props = {};
Object.keys(pickerProps).forEach(key => {
props[key] = this[key];
});
return (
<Picker
class={bem()}
ref="picker"
columns={this.columns}
onChange={this.onChange}
onConfirm={this.onConfirm}
onCancel={() => {
this.$emit('cancel');
}}
{...{ props }}
/>
);
}
});
@@ -0,0 +1,447 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`renders demo correctly 1`] = `
<div>
<div>
<div class="van-picker van-datetime-picker">
<div class="van-hairline--top-bottom van-picker__toolbar">
<div role="button" tabindex="0" class="van-picker__cancel">取消</div>
<div role="button" tabindex="0" class="van-picker__confirm">确认</div>
</div>
<!---->
<div class="van-picker__columns" style="height: 220px;">
<div class="van-picker-column">
<ul class="van-picker-column__wrapper" style="transform: translate3d(0, 88px, 0); transition-duration: 0ms; transition-property: none; line-height: 44px;">
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">2018</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">2019</li>
</ul>
</div>
<div class="van-picker-column">
<ul class="van-picker-column__wrapper" style="transform: translate3d(0, 88px, 0); transition-duration: 0ms; transition-property: none; line-height: 44px;">
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">01</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">02</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">03</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">04</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">05</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">06</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">07</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">08</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">09</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">10</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">11</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">12</li>
</ul>
</div>
<div class="van-picker-column">
<ul class="van-picker-column__wrapper" style="transform: translate3d(0, 88px, 0); transition-duration: 0ms; transition-property: none; line-height: 44px;">
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">01</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">02</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">03</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">04</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">05</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">06</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">07</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">08</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">09</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">10</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">11</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">12</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">13</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">14</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">15</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">16</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">17</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">18</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">19</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">20</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">21</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">22</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">23</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">24</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">25</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">26</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">27</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">28</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">29</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">30</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">31</li>
</ul>
</div>
<div class="van-picker-column">
<ul class="van-picker-column__wrapper" style="transform: translate3d(0, 88px, 0); transition-duration: 0ms; transition-property: none; line-height: 44px;">
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">00</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">01</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">02</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">03</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">04</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">05</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">06</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">07</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">08</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">09</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">10</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">11</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">12</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">13</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">14</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">15</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">16</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">17</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">18</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">19</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">20</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">21</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">22</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">23</li>
</ul>
</div>
<div class="van-picker-column">
<ul class="van-picker-column__wrapper" style="transform: translate3d(0, 88px, 0); transition-duration: 0ms; transition-property: none; line-height: 44px;">
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">00</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">01</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">02</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">03</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">04</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">05</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">06</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">07</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">08</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">09</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">10</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">11</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">12</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">13</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">14</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">15</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">16</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">17</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">18</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">19</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">20</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">21</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">22</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">23</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">24</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">25</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">26</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">27</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">28</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">29</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">30</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">31</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">32</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">33</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">34</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">35</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">36</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">37</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">38</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">39</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">40</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">41</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">42</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">43</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">44</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">45</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">46</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">47</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">48</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">49</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">50</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">51</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">52</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">53</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">54</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">55</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">56</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">57</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">58</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">59</li>
</ul>
</div>
<div class="van-picker__mask" style="background-size: 100% 88px;"></div>
<div class="van-hairline--top-bottom van-picker__frame" style="height: 44px;"></div>
</div>
<!---->
</div>
</div>
<div>
<div class="van-picker van-datetime-picker">
<div class="van-hairline--top-bottom van-picker__toolbar">
<div role="button" tabindex="0" class="van-picker__cancel">取消</div>
<div role="button" tabindex="0" class="van-picker__confirm">确认</div>
</div>
<!---->
<div class="van-picker__columns" style="height: 220px;">
<div class="van-picker-column">
<ul class="van-picker-column__wrapper" style="transform: translate3d(0, 88px, 0); transition-duration: 0ms; transition-property: none; line-height: 44px;">
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">2018</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">2019</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">2020</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">2021</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">2022</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">2023</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">2024</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">2025</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">2026</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">2027</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">2028</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">2029</li>
</ul>
</div>
<div class="van-picker-column">
<ul class="van-picker-column__wrapper" style="transform: translate3d(0, 88px, 0); transition-duration: 0ms; transition-property: none; line-height: 44px;">
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">01</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">02</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">03</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">04</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">05</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">06</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">07</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">08</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">09</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">10</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">11</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">12</li>
</ul>
</div>
<div class="van-picker-column">
<ul class="van-picker-column__wrapper" style="transform: translate3d(0, 88px, 0); transition-duration: 0ms; transition-property: none; line-height: 44px;">
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">01</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">02</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">03</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">04</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">05</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">06</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">07</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">08</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">09</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">10</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">11</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">12</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">13</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">14</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">15</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">16</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">17</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">18</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">19</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">20</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">21</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">22</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">23</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">24</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">25</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">26</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">27</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">28</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">29</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">30</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">31</li>
</ul>
</div>
<div class="van-picker__mask" style="background-size: 100% 88px;"></div>
<div class="van-hairline--top-bottom van-picker__frame" style="height: 44px;"></div>
</div>
<!---->
</div>
</div>
<div>
<div class="van-picker van-datetime-picker">
<div class="van-hairline--top-bottom van-picker__toolbar">
<div role="button" tabindex="0" class="van-picker__cancel">取消</div>
<div role="button" tabindex="0" class="van-picker__confirm">确认</div>
</div>
<!---->
<div class="van-picker__columns" style="height: 220px;">
<div class="van-picker-column">
<ul class="van-picker-column__wrapper" style="transform: translate3d(0, 88px, 0); transition-duration: 0ms; transition-property: none; line-height: 44px;">
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">2018年</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">2019年</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">2020年</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">2021年</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">2022年</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">2023年</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">2024年</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">2025年</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">2026年</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">2027年</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">2028年</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">2029年</li>
</ul>
</div>
<div class="van-picker-column">
<ul class="van-picker-column__wrapper" style="transform: translate3d(0, 88px, 0); transition-duration: 0ms; transition-property: none; line-height: 44px;">
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">01月</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">02月</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">03月</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">04月</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">05月</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">06月</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">07月</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">08月</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">09月</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">10月</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">11月</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">12月</li>
</ul>
</div>
<div class="van-picker__mask" style="background-size: 100% 88px;"></div>
<div class="van-hairline--top-bottom van-picker__frame" style="height: 44px;"></div>
</div>
<!---->
</div>
</div>
<div>
<div class="van-picker van-datetime-picker">
<div class="van-hairline--top-bottom van-picker__toolbar">
<div role="button" tabindex="0" class="van-picker__cancel">取消</div>
<div role="button" tabindex="0" class="van-picker__confirm">确认</div>
</div>
<!---->
<div class="van-picker__columns" style="height: 220px;">
<div class="van-picker-column">
<ul class="van-picker-column__wrapper" style="transform: translate3d(0, 0px, 0); transition-duration: 0ms; transition-property: none; line-height: 44px;">
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">10</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">11</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">12</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">13</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">14</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">15</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">16</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">17</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">18</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">19</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">20</li>
</ul>
</div>
<div class="van-picker-column">
<ul class="van-picker-column__wrapper" style="transform: translate3d(0, 88px, 0); transition-duration: 0ms; transition-property: none; line-height: 44px;">
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">00</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">01</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">02</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">03</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">04</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">05</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">06</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">07</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">08</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">09</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">10</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">11</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">12</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">13</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">14</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">15</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">16</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">17</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">18</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">19</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">20</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">21</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">22</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">23</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">24</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">25</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">26</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">27</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">28</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">29</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">30</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">31</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">32</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">33</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">34</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">35</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">36</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">37</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">38</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">39</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">40</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">41</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">42</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">43</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">44</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">45</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">46</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">47</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">48</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">49</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">50</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">51</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">52</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">53</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">54</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">55</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">56</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">57</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">58</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">59</li>
</ul>
</div>
<div class="van-picker__mask" style="background-size: 100% 88px;"></div>
<div class="van-hairline--top-bottom van-picker__frame" style="height: 44px;"></div>
</div>
<!---->
</div>
</div>
<div>
<div class="van-picker van-datetime-picker">
<div class="van-hairline--top-bottom van-picker__toolbar">
<div role="button" tabindex="0" class="van-picker__cancel">取消</div>
<div role="button" tabindex="0" class="van-picker__confirm">确认</div>
</div>
<!---->
<div class="van-picker__columns" style="height: 220px;">
<div class="van-picker-column">
<ul class="van-picker-column__wrapper" style="transform: translate3d(0, -440px, 0); transition-duration: 0ms; transition-property: none; line-height: 44px;">
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">00</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">01</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">02</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">03</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">04</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">05</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">06</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">07</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">08</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">09</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">10</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">11</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">12</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">13</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">14</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">15</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">16</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">17</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">18</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">19</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">20</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">21</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">22</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">23</li>
</ul>
</div>
<div class="van-picker-column">
<ul class="van-picker-column__wrapper" style="transform: translate3d(0, 88px, 0); transition-duration: 0ms; transition-property: none; line-height: 44px;">
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">00</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">05</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">10</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">15</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">20</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">25</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">30</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">35</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">40</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">45</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">50</li>
<li class="van-ellipsis van-picker-column__item" style="height: 44px;">55</li>
</ul>
</div>
<div class="van-picker__mask" style="background-size: 100% 88px;"></div>
<div class="van-hairline--top-bottom van-picker__frame" style="height: 44px;"></div>
</div>
<!---->
</div>
</div>
</div>
`;
+4
View File
@@ -0,0 +1,4 @@
import Demo from '../demo';
import demoTest from '../../../test/demo-test';
demoTest(Demo);
+25
View File
@@ -0,0 +1,25 @@
export function isValidDate(date) {
return Object.prototype.toString.call(date) === '[object Date]' && !isNaN(date.getTime());
}
export function times(n, iteratee) {
let index = -1;
const result = Array(n);
while (++index < n) {
result[index] = iteratee(index);
}
return result;
}
export function getTrueValue(formattedValue) {
if (!formattedValue) return;
while (isNaN(parseInt(formattedValue, 10))) {
formattedValue = formattedValue.slice(1);
}
return parseInt(formattedValue, 10);
}
export function getMonthEndDay(year, month) {
return 32 - new Date(year, month - 1, 32).getDate();
}
+191
View File
@@ -0,0 +1,191 @@
# DatetimePicker 时间选择
### 介绍
时间选择组件通常与 [弹出层](#/zh-CN/popup) 组件配合使用
### 引入
``` javascript
import { DatetimePicker } from 'vant';
Vue.use(DatetimePicker);
```
## 代码演示
### 选择完整时间
```html
<van-datetime-picker
v-model="currentDate"
type="datetime"
:min-date="minDate"
:max-date="maxDate"
/>
```
```javascript
export default {
data() {
return {
minHour: 10,
maxHour: 20,
minDate: new Date(),
maxDate: new Date(2019, 10, 1),
currentDate: new Date()
};
}
};
```
### 选择日期(年月日)
```html
<van-datetime-picker
v-model="currentDate"
type="date"
:min-date="minDate"
/>
```
```js
export default {
data() {
return {
currentDate: new Date()
};
}
}
```
### 选择日期(年月)
通过传入`formatter`函数,可以对选项文字进行格式化处理
```html
<van-datetime-picker
v-model="currentDate"
type="year-month"
:min-date="minDate"
:formatter="formatter"
/>
```
```js
export default {
data() {
return {
currentDate: new Date()
};
},
methods: {
formatter(type, value) {
if (type === 'year') {
return `${value}年`;
} else if (type === 'month') {
return `${value}月`
}
return value;
}
}
}
```
### 选择时间
```html
<van-datetime-picker
v-model="currentTime"
type="time"
:min-hour="10"
:max-hour="20"
/>
```
```js
export default {
data() {
return {
currentTime: '12:00'
};
}
}
```
### 选项过滤器
通过传入`filter`函数,可以对选项数组进行过滤,实现自定义时间间隔
```html
<van-datetime-picker
v-model="currentTime"
type="time"
:filter="filter"
/>
```
```js
export default {
data() {
return {
currentTime: '12:00'
};
},
methods: {
filter(type, options) {
if (type === 'minute') {
return options.filter(option => option % 5 === 0)
}
return options;
}
}
}
```
## API
### Props
| 参数 | 说明 | 类型 | 默认值 | 版本 |
|------|------|------|------|------|
| type | 类型,可选值为 `date` <br> `time` `year-month` | `String` | `datetime` | 1.0.2 |
| min-date | 可选的最小时间,精确到分钟 | `Date` | 十年前 | - |
| max-date | 可选的最大时间,精确到分钟 | `Date` | 十年后 | - |
| min-hour | 可选的最小小时,针对 time 类型 | `Number` | `0` | - |
| max-hour | 可选的最大小时,针对 time 类型 | `Number` | `23` | - |
| min-minute | 可选的最小分钟,针对 time 类型 | `Number` | `0` | 1.1.15 |
| max-minute | 可选的最大分钟,针对 time 类型 | `Number` | `59` | 1.1.15 |
| filter | 选项过滤函数 | `(type, values) => values` | - | 2.0.0 |
| formatter | 选项格式化函数 | `(type, value) => value` | - | 1.1.14 |
| title | 顶部栏标题 | `String` | `''` | 1.0.4 |
| show-toolbar | 是否显示顶部栏 | `Boolean` | `false` | 1.0.2 |
| loading | 是否显示加载状态 | `Boolean` | `false` | 1.0.4 |
| item-height | 选项高度 | `Number` | `44` | 1.0.4 |
| confirm-button-text | 确认按钮文字 | `String` | `确认` | 1.0.4 |
| cancel-button-text | 取消按钮文字 | `String` | `取消` | 1.0.4 |
| visible-item-count | 可见的选项个数 | `Number` | `5` | 1.0.4 |
### Events
| 事件名 | 说明 | 回调参数 |
|------|------|------|
| change | 当值变化时触发的事件 | picker 实例 |
| confirm | 点击完成按钮时触发的事件 | 当前 value |
| cancel | 点击取消按钮时触发的事件 | - |
### change 事件
在`change`事件中,可以获取到`picker`实例,对`picker`进行相应的更新等操作:
| 函数 | 说明 |
|------|------|
| getColumnValue(index) | 获取对应列中选中的值 |
| setColumnValue(index, value) | 设置对应列中选中的值 |
| getColumnValues(index) | 获取对应列中所有的备选值 |
| setColumnValues(index, values) | 设置对应列中所有的备选值 |
| getValues() | 获取所有列中被选中的值,返回一个数组 |
| setValues(values) | `values`为一个数组,设置所有列中被选中的值 |