From c5cfec35e1e420a5b33336728c68342ec27358f9 Mon Sep 17 00:00:00 2001 From: xwenliang Date: Fri, 25 Dec 2015 14:13:24 +0800 Subject: [PATCH] issue#5 --- index.js | 71 ++++++++++++++++++++++++++++++++++++---------------- package.json | 2 +- 2 files changed, 51 insertions(+), 22 deletions(-) diff --git a/index.js b/index.js index 0411a4b..ba82c8c 100644 --- a/index.js +++ b/index.js @@ -41,10 +41,30 @@ export default class PickerAny extends React.Component { constructor(props, context){ super(props, context); + } + + componentWillMount(){ + this.state = this._getStateFromProps(this.props); + } + + componentWillReceiveProps(newProps){ + let newState = this._getStateFromProps(newProps); + this.setState(newState); + } + + _getStateFromProps(props){ //the pickedValue must looks like [wheelone's, wheeltwo's, ...] - //this.state.selectedValue may be the result of the first pickerWheel - let pickedValue = this.props.selectedValue; - let pickerData = this.props.pickerData; + //this.state.selectedValue may be the result of the first pickerWheel + let pickerBtnText = props.pickerBtnText; + let pickerBtnStyle = props.pickerBtnStyle; + let pickerToolBarStyle = props.pickerToolBarStyle; + let pickerItemStyle = props.pickerItemStyle; + let pickerHeight = props.pickerHeight; + let showDuration = props.showDuration; + let pickerData = props.pickerData; + let selectedValue = props.selectedValue; + let onPickerDone = props.onPickerDone; + let pickerStyle = pickerData.constructor === Array ? 'parallel' : 'cascade'; let firstWheelData; let firstPickedData; @@ -55,8 +75,8 @@ export default class PickerAny extends React.Component { let cascadeData = {}; if(pickerStyle === 'parallel'){ //compatible single wheel sence - if(pickedValue.constructor !== Array){ - pickedValue = [pickedValue]; + if(selectedValue.constructor !== Array){ + selectedValue = [selectedValue]; } if(pickerData[0].constructor !== Array){ pickerData = [pickerData]; @@ -65,18 +85,28 @@ export default class PickerAny extends React.Component { else if(pickerStyle === 'cascade'){ //only support three stage firstWheelData = Object.keys(pickerData); - firstPickedData = this.props.selectedValue[0]; - secondPickedData = this.props.selectedValue[1]; - cascadeData = this._getCascadeData(pickerData, pickedValue, firstPickedData, secondPickedData, true); + firstPickedData = props.selectedValue[0]; + secondPickedData = props.selectedValue[1]; + cascadeData = this._getCascadeData(pickerData, selectedValue, firstPickedData, secondPickedData, true); } - this.state = { - slideAnim: new Animated.Value(-this.props.pickerHeight), + //保存了已经选择到的数据 + this.pickedValue = selectedValue; + this.pickerStyle = pickerStyle; + return { + pickerBtnText, + pickerBtnStyle, + pickerToolBarStyle, + pickerItemStyle, + pickerHeight, + showDuration, pickerData, - selectedValue: pickedValue, + selectedValue, + onPickerDone, //list of first wheel data firstWheelData, //first wheel selected value firstPickedData, + slideAnim: new Animated.Value(-props.pickerHeight), //list of second wheel data and pickedDataIndex secondWheelData: cascadeData.secondWheelData, secondPickedDataIndex: cascadeData.secondPickedDataIndex, @@ -84,8 +114,6 @@ export default class PickerAny extends React.Component { thirdWheelData: cascadeData.thirdWheelData, thirdPickedDataIndex: cascadeData.thirdPickedDataIndex }; - this.pickedValue = pickedValue; - this.pickerStyle = pickerStyle; } _slideUp(){ @@ -94,7 +122,7 @@ export default class PickerAny extends React.Component { this.state.slideAnim, { toValue: 0, - duration: this.props.showDuration, + duration: this.state.showDuration, } ).start((evt) => { if(evt.finished) { @@ -109,8 +137,8 @@ export default class PickerAny extends React.Component { Animated.timing( this.state.slideAnim, { - toValue: -this.props.pickerHeight, - duration: this.props.showDuration, + toValue: -this.state.pickerHeight, + duration: this.state.showDuration, } ).start((evt) => { if(evt.finished) { @@ -148,7 +176,8 @@ export default class PickerAny extends React.Component { _pickerFinish(){ this._toggle(); - this.props.onPickerDone(this.pickedValue); + debugger; + this.state.onPickerDone(this.pickedValue); } _renderParallelWheel(pickerData){ @@ -385,14 +414,14 @@ export default class PickerAny extends React.Component { let pickerBtn = null; return ( - + {pickerBtn} - {this.props.pickerBtnText} + {this.state.pickerBtnText} diff --git a/package.json b/package.json index 3c1db64..f8282a5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-native-picker", - "version": "0.2.3", + "version": "0.2.4", "description": "react-native-picker", "main": "index.js", "scripts": { -- 2.26.2