diff --git a/MonthList.js b/MonthList.js index 9c05255..ff153be 100644 --- a/MonthList.js +++ b/MonthList.js @@ -2,28 +2,25 @@ * Created by TinySymphony on 2017-05-11. */ -import React, {PropTypes, Component} from 'react'; +import React, {PropTypes, PureComponent} from 'react'; import { View, Text, - ListView, + FlatList, Dimensions } from 'react-native'; import Moment from 'moment'; import styles from './CalendarStyle'; import Month from './Month'; + const {width} = Dimensions.get('window'); -export default class MonthList extends Component { + +export default class MonthList extends PureComponent { constructor (props) { super(props); - this.ds = new ListView.DataSource({ - rowHasChanged: (r1, r2) => { - return r2.shouldUpdate; - } - }); this.monthList = []; this.state = { - dataSource: this.ds.cloneWithRows(this._getMonthList()) + dataSource: this._getMonthList() }; this._renderMonth = this._renderMonth.bind(this); this._shouldUpdate = this._shouldUpdate.bind(this); @@ -31,28 +28,30 @@ export default class MonthList extends Component { this._getWeekNums = this._getWeekNums.bind(this); this._scrollToSelecetdMonth = this._scrollToSelecetdMonth.bind(this); } - componentWillReceiveProps (nextProps) { + + componentDidUpdate(prevProps) { let isDateUpdated = ['startDate', 'endDate', 'minDate', 'maxDate'].reduce((prev, next) => { - if (prev || nextProps[next] !== this.props[next]) { + if (prev || prevProps[next] !== this.props[next]) { return true; } return prev; }, false); if (isDateUpdated) { this.setState({ - dataSource: - this.state.dataSource.cloneWithRows(this._getMonthList(nextProps)) + dataSource: this._getMonthList(this.props) }); } } - _renderMonth (month) { + + _renderMonth = ({item}) => { return ( ); - } + }; + _checkRange (date, start, end) { if (!date || !start) return false; if (!end) return date.year() === start.year() && date.month() === start.month(); @@ -60,6 +59,7 @@ export default class MonthList extends Component { if (date.year() > end.year() || (date.year() === end.year() && date.month() > end.month())) return false; return true; } + _shouldUpdate (month, props) { if (!props) return false; const { @@ -74,6 +74,7 @@ export default class MonthList extends Component { if (prev || next) return true; return false; } + _getMonthList (props) { let minDate = (props || this.props).minDate.clone().date(1); let maxDate = (props || this.props).maxDate.clone(); @@ -92,6 +93,7 @@ export default class MonthList extends Component { } return monthList; } + _getWeekNums(start, end) { let clonedMoment = Moment(start), date, day, num, y, m, total = 0; while (!clonedMoment.isSame(end, 'months')) { @@ -105,6 +107,7 @@ export default class MonthList extends Component { } return total; } + _scrollToSelecetdMonth () { const { startDate, @@ -114,23 +117,25 @@ export default class MonthList extends Component { startDate.month() - minDate.month(); let weekOffset = this._getWeekNums(minDate, startDate); setTimeout(() => { - this.list && this.list.scrollTo({ - x: 0, - y: monthOffset * (24 + 25) + (monthOffset ? weekOffset * Math.ceil(width / 7 + 10) : 0), + this.list && this.list.scrollToOffset({ + offset: monthOffset * (24 + 25) + (monthOffset ? weekOffset * Math.ceil(width / 7 + 10) : 0), animated: true }); }, 400); } + componentDidMount () { this.props.startDate && this._scrollToSelecetdMonth(); } + render () { return ( - {this.list = list;}} style={styles.scrollArea} - dataSource={this.state.dataSource} - renderRow={this._renderMonth} + data={this.state.dataSource} + renderItem={this._renderMonth} + keyExtractor={() => String(Math.random())} pageSize={2} initialListSize={2} showsVerticalScrollIndicator={false}