Skip to content

Commit 14b868c

Browse files
[changed] ✅ update version,An increase of five theme,A slide can move multiple dates.
1 parent b58f041 commit 14b868c

20 files changed

Lines changed: 1212 additions & 800 deletions

.github/preview.gif

118 KB
Loading

README.md

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,10 @@ class App extends React.Component {
5353
this.setState({ isOpen: true });
5454
}
5555

56+
handleCancel = () => {
57+
this.setState({ isOpen: false });
58+
}
59+
5660
handleSelect = (time) => {
5761
this.setState({ time, isOpen: false });
5862
}
@@ -70,9 +74,10 @@ class App extends React.Component {
7074
</p>
7175

7276
<DatePicker
73-
date={this.state.time}
77+
value={this.state.time}
7478
isOpen={this.state.isOpen}
75-
onSelect={this.handleSelect} />
79+
onSelect={this.handleSelect}
80+
onCancel={this.handleCancel} />
7681
</div>
7782
);
7883
}
@@ -87,13 +92,14 @@ ReactDOM.render(<App />, document.getElementById('react-box'));
8792

8893
| Property | Type | Default | Description |
8994
|:------------- |:------------- |:-------------- |:---------- |
90-
| btnColor | String | #fff | done button color |
91-
| dateColor | String | #fff | date of text color |
92-
| layerBackground | String | #ffa70b | background color |
93-
| date | Date | new Date() | date value |
94-
| minDate | Date | new Date(1970, 0, 1) | minimum date |
95-
| maxDate | Date | new Date(2050, 0, 1) | maximum date |
95+
| isOpen | Boolean | false | whether to open datepicker |
96+
| theme | String | default | theme of datepicker, include 'default', 'dark', 'ios', 'android', 'android-dark' |
97+
| dateFormat | Array | ['YYYY', 'M', 'D'] | according to year, month, day format specified display text. E.g ['YYYY年', 'MM月', 'DD日']|
98+
| value | Date | new Date() | date value |
99+
| min | Date | new Date(1970, 0, 1) | minimum date |
100+
| max | Date | new Date(2050, 0, 1) | maximum date |
96101
| onSelect | Function | () => {} | the callback function after click button of done, Date object as a parameter |
102+
| onCancel | Function | () => {} | the callback function after click button of cancel |
97103

98104
## Changelog
99105
* [Changelog](CHANGELOG.md)

dist/react-mobile-datepicker.js

Lines changed: 322 additions & 222 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/react-mobile-datepicker.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/react-mobile-datepicker.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/react-mobile-datepicker.min.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

examples/basic/index.js

Lines changed: 29 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,25 @@ import './main.css';
22
import React from 'react';
33
import ReactDOM from 'react-dom';
44
import { convertDate } from '../../lib/time.js';
5-
import DatePicker from '../../lib/index';
6-
// import DatePicker from '../../dist/react-mobile-datepicker.js';
5+
// import DatePicker from '../../lib/index';
6+
import DatePicker from '../../dist/react-mobile-datepicker.js';
77

8-
(function main() {
9-
const BACKGROUNDS = {
10-
'yellow': '#ffa70b',
11-
'blue': '#0483bc',
12-
'black': '#333',
13-
};
8+
window.Perf = require('react-addons-perf');
149

10+
(function main() {
1511
class App extends React.Component {
1612
state = {
1713
time: new Date(),
1814
isOpen: false,
19-
layerBackground: BACKGROUNDS.yellow,
15+
theme: 'default',
2016
}
2117

22-
handleClick = () => {
23-
this.setState({ isOpen: true });
18+
handleToggle = (isOpen) => () => {
19+
this.setState({ isOpen });
2420
}
2521

26-
handleBackgroundClick = (background) => () => {
27-
this.setState({ layerBackground: BACKGROUNDS[background] });
22+
handleThemeToggle = (theme) => () => {
23+
this.setState({ theme, isOpen: true });
2824
}
2925

3026
handleSelect = (time) => {
@@ -34,39 +30,42 @@ import DatePicker from '../../lib/index';
3430
render() {
3531
return (
3632
<div className="App">
37-
<a
38-
className="select-btn"
39-
onClick={this.handleClick}>
40-
select time
41-
</a>
4233
<p className="select-time ">
4334
{convertDate(this.state.time, 'YYYY-MM-DD')}
4435
</p>
4536
<div>
4637
<a
4738
className="select-btn sm"
48-
style={{ background: BACKGROUNDS.yellow }}
49-
onClick={this.handleBackgroundClick('yellow')}>
50-
yellow
39+
onClick={this.handleThemeToggle('default')}>
40+
default
41+
</a>
42+
<a
43+
className="select-btn sm"
44+
onClick={this.handleThemeToggle('dark')}>
45+
dark
46+
</a>
47+
<a
48+
className="select-btn sm"
49+
onClick={this.handleThemeToggle('ios')}>
50+
ios
5151
</a>
5252
<a
5353
className="select-btn sm"
54-
style={{ background: BACKGROUNDS.blue }}
55-
onClick={this.handleBackgroundClick('blue')}>
56-
blue
54+
onClick={this.handleThemeToggle('android')}>
55+
android
5756
</a>
5857
<a
5958
className="select-btn sm"
60-
style={{ background: BACKGROUNDS.black }}
61-
onClick={this.handleBackgroundClick('black')}>
62-
black
59+
onClick={this.handleThemeToggle('android-dark')}>
60+
android-dark
6361
</a>
6462
</div>
6563
<DatePicker
66-
layerBackground={this.state.layerBackground}
67-
date={this.state.time}
64+
value={this.state.time}
65+
theme={this.state.theme}
6866
isOpen={this.state.isOpen}
69-
onSelect={this.handleSelect} />
67+
onSelect={this.handleSelect}
68+
onCancel={this.handleToggle(false)} />
7069
</div>
7170
);
7271
}

examples/basic/main.css

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
&.sm {
2525
margin: .5rem .5rem;
2626
padding: .5rem;
27-
color: #fff;
2827
}
2928
}
3029

lib/DatePicker.js

Lines changed: 59 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,125 +1,124 @@
11
/**
2-
* @module DatePicker组件
2+
* @module DatePicker Component
33
*/
44

55
import React, { Component, PropTypes } from 'react';
66
import DatePickerItem from './DatePickerItem.js';
7-
import { nextDate, getTime } from './time.js';
7+
import PureRender from './pureRender.js';
8+
import { convertDate, nextDate } from './time.js';
89

910
/**
10-
* Class DatePicker组件类
11+
* Class DatePicker Component Class
1112
* @extends Component
1213
*/
1314
class DatePicker extends Component {
1415
constructor(props) {
15-
super(props); // 容器转过的角度
16+
super(props);
1617
this.state = {
17-
date: this._productDate(props.date),
18-
minDate: this._productDate(props.minDate),
19-
maxDate: this._productDate(props.maxDate),
18+
value: nextDate(this.props.value),
2019
};
2120

2221
this.handleFinishBtnClick = this.handleFinishBtnClick.bind(this);
2322
this.handleDateSelect = this.handleDateSelect.bind(this);
2423
}
2524

2625
componentWillReceiveProps(nextProps) {
27-
this.setState({
28-
date: this._productDate(nextProps.date),
29-
minDate: this._productDate(nextProps.minDate),
30-
maxDate: this._productDate(nextProps.maxDate),
31-
});
26+
// update value of state
27+
const date = nextDate(nextProps.value);
28+
if (date.getTime() !== this.state.value.getTime()) {
29+
this.setState({ value: date });
30+
}
3231
}
3332

34-
_productDate(date) {
35-
const nDate = nextDate(date, 0);
36-
return {
37-
value: nDate,
38-
timestamp: nDate.getTime(),
39-
Year: getTime(nDate, 'Year'),
40-
Month: getTime(nDate, 'Month'),
41-
Date: getTime(nDate, 'Date'),
42-
};
33+
/**
34+
* Optimization component, Prevents unnecessary rendering
35+
* Only props or state change or value before re-rendering
36+
*
37+
* @param {Object} nextProps next props
38+
* @param {Object} nextState next state
39+
* @return {Boolean} Whether re-rendering
40+
*/
41+
shouldComponentUpdate(nextProps, nextState) {
42+
const date = nextDate(nextState.value);
43+
return date.getTime() !== this.state.value.getTime() ||
44+
PureRender.shouldComponentUpdate(nextProps, nextState, this.props, this.state);
4345
}
4446

4547
/**
4648
* 点击完成按钮事件
4749
* @return {undefined}
4850
*/
4951
handleFinishBtnClick() {
50-
this.props.onSelect(this.state.date.value);
52+
this.props.onSelect(this.state.value);
5153
}
5254

5355
/**
5456
* 选择下一个日期
5557
* @return {undefined}
5658
*/
57-
handleDateSelect(date) {
58-
this.setState({ date: this._productDate(date) });
59+
handleDateSelect(value) {
60+
this.setState({ value });
5961
}
6062

6163
/**
6264
* render函数
6365
* @return {Object} JSX对象
6466
*/
6567
render() {
66-
const { layerBackground, btnColor, touchLen, dateColor } = this.props;
67-
const { date, minDate, maxDate } = this.state;
68-
const datePickerStyle = {
69-
backgroundColor: layerBackground,
70-
};
68+
const { min, max, theme, dateFormat } = this.props;
69+
const value = this.state.value;
70+
const themeClassName =
71+
['default', 'dark', 'ios', 'android', 'android-dark'].indexOf(theme) === -1 ?
72+
'default' : theme;
7173

7274
return (
7375
<div
74-
className="datepicker"
75-
style={datePickerStyle}>
76-
<p className="datepicker-navbar">
77-
<span
78-
style={{ color: btnColor }}
79-
className="datepicker-finish-btn"
80-
onClick={this.handleFinishBtnClick}>完成</span>
81-
</p>
76+
className={`datepicker ${themeClassName}`}>
77+
<div className="datepicker-header">{convertDate(value, 'YYYY/MM/DD')}</div>
8278
<div className="datepicker-content">
8379
<DatePickerItem
84-
date={date}
80+
value={value}
81+
min={min}
82+
max={max}
8583
typeName="Year"
86-
minDate={minDate}
87-
maxDate={maxDate}
88-
touchLen={touchLen}
89-
dateColor={dateColor}
84+
format={dateFormat[0]}
9085
onSelect={this.handleDateSelect} />
9186
<DatePickerItem
92-
date={date}
87+
value={value}
88+
min={min}
89+
max={max}
9390
typeName="Month"
94-
minDate={minDate}
95-
maxDate={maxDate}
96-
touchLen={touchLen}
97-
dateColor={dateColor}
91+
format={dateFormat[1]}
9892
onSelect={this.handleDateSelect} />
9993
<DatePickerItem
100-
date={date}
94+
value={value}
95+
min={min}
96+
max={max}
10197
typeName="Date"
102-
minDate={minDate}
103-
maxDate={maxDate}
104-
touchLen={touchLen}
105-
dateColor={dateColor}
98+
format={dateFormat[2]}
10699
onSelect={this.handleDateSelect} />
107100
</div>
101+
<div className="datepicker-navbar">
102+
<a
103+
className="datepicker-navbar-btn"
104+
onClick={this.handleFinishBtnClick}>完成</a>
105+
<a
106+
className="datepicker-navbar-btn"
107+
onClick={this.props.onCancel}>取消</a>
108+
</div>
108109
</div>
109110
);
110111
}
111112
}
112113

113114
DatePicker.propTypes = {
114-
touchLen: PropTypes.number,
115-
btnColor: PropTypes.string,
116-
dateColor: PropTypes.string,
117-
layerBackground: PropTypes.string,
118-
date: PropTypes.object,
119-
minDate: PropTypes.object,
120-
maxDate: PropTypes.object,
115+
theme: PropTypes.string,
116+
value: PropTypes.object,
117+
min: PropTypes.object,
118+
max: PropTypes.object,
119+
dateFormat: PropTypes.array,
121120
onSelect: PropTypes.func,
121+
onCancel: PropTypes.func,
122122
};
123123

124-
125124
export default DatePicker;

0 commit comments

Comments
 (0)