2017-06-08 9 views
0

enter code hereWheel Pickerコンポーネントをプロジェクトに含めることを試みていました。それはステートフルなコンポーネントでそれをカバーするときにうまくいきます。私はステートレスコンポーネントに変換しようとしました。ホイールをスクロールすると、選択されたインデックスは常にデフォルト値にインデックスされます(例:アイテム番号10にスクロールし、私は正しい値を受け取りますが、デフォルト値0に戻ります)。私のコンポーネントに何か問題がありますか?ステートレスコンポーネントの状態の代替

import React, {PropTypes} from 'react' 

import { 
    Component, 
    StyleSheet, 
    Text, 
    View 
} from 'react-native'; 

import Picker from 'react-native-wheel-picker' 
var PickerItem = Picker.Item; 
const styles = StyleSheet.create({ 
    container: { 
     flex: 1, 
     justifyContent: 'center', 
     alignItems: 'center', 
     backgroundColor: 'transparent', 
    }, 

}); 

const WheelTimePicker = ({selectedItems, receiveTime}) => { 
    const _renderPikcer =() => { 
     firstData = { 
      secondList: [], 
      minuteList: [], 
     }; 
    for (var i = 0; i < 60; i++) { 
      firstData.secondList.push(i + 'sec'); 
      firstData.minuteList.push(i + 'min'); 
     } 

     return (
      <View> 
      <Picker style={{ left: -70, width: 60, height: 60 }} 
       selectedValue={selectedItems.selectedMin} 
       itemStyle={{ color: "white", fontSize: 20 }} 
       onValueChange={(index) => { selectedItems.selectedMin = index;receiveTime(selectedItems); }}> 
       {firstData.minuteList.map((value, i) => (
        <PickerItem label={value} value={i} key={"money" + value} /> 
       ))} 
      </Picker> 
      <Picker style={{ left: 60, width: 60, height: 70 }} 
       selectedValue={selectedItems.selectedSec} 
       itemStyle={{ color: "white", fontSize: 20 }} 
       onValueChange={(index) => { selectedItems.selectedSec = index; receiveTime(selectedItems) }}> 
       {firstData.secondList.map((value, i) => (
        <PickerItem label={value} value={i} key={"money" + value} /> 
       ))} 
      </Picker> 
      </View> 
     ); 
    } 

    return (

     <View style={styles.container}> 
    {_renderPikcer()} 

     </View> 
    ); 

}; 

WheelTimePicker.propTypes = { 
    selectedItems: PropTypes.object.isRequired, 
    receiveTime: PropTypes.func.isRequired, 
}; 
export default WheelTimePicker; 

私はこのようなコンポーネントを置く:

<WheelTimePicker selectedItems={{selectedMin: 2, selectedSec: 0}} receiveTime={(rc)=> _displayTime(rc)}/> 
+0

:そして、あなたのPickerで、おそらく少しのようなものに調整する必要があります。 –

+0

ステートレスコンポーネントとReduxを使用してすべてのステートフルコンポーネントを置き換えることができますか?ステートフルコンポーネントを使用するよりも複雑な動作をしたりグローバルステート(ストア)を使用すると感じられることがあります。 – Ohaha

+0

状況による - コンポーネントが他のコンポーネントとデータを共有する必要がない場合、コンポーネントをグローバルストアに追加する必要はありません。 –

答えて

0

を使用すると、親要素から渡され取得されpropsを変更しようとしているためです。私。ステートレスコンポーネントで渡されたパラメータは小道具です。小道具は読み取り専用です(https://facebook.github.io/react/docs/components-and-props.html#props-are-read-only

また、コンポーネントの状態に潜在的に存在する可能性があるレンダー機能内の値を更新しようとしています。この特定のシナリオでは、コンポーネントに渡されている小道具であるselectedItemsの内容を変更しようとしています。

selectedItemsのコンテンツを更新するには、selectedItemsを親コンポーネントの状態として保持し、値を更新するためにsetStateを使用することをお勧めします(これはおそらく元のアプローチです。例

class ParentComponent extends Component { 
    constructor(props) { 
    super(props); 
    this.state = { 
     selectedItems: { 
     selectedMin: 2, 
     selectedSec: 0 
     } 
    } 
    } 

    _updateSelectedItems(rc) { 
    this.setState({ 
     selectedItems: { 
     selectedMin: rc.selectedMin || this.state.selectedMin, 
     selectedSec: rc.selectedSec || this.state.selectedSec 
     } 
    }) 
    } 

    render() { 
    return (
     <WheelTimePicker selectedItems={this.state.selectedItems} receiveTime={(rc) => this._updateSelectedItems(rc)}/> 
    ) 
    } 
} 

この方法についてステートフルコンポーネント」)

でそれをカバーし、あなたのWheelTimePickerコンポーネントはステートレスすることができます。コンポーネントが小道具ではなく、状態によって値が表示されますので、あなたは、あなたのアプリにReduxの統合をご覧ください

<Picker 
    ... 
    onValueChange={(index) => { receiveTime({selectedMin:index});}} 
/> 
+0

あなたはそうです。私はちょうどステートレスコンポーネントのコンセプトについて混乱させました。状態のないコンポーネントとreduxは、ステートフルなコンポーネントを完全に置き換えるために作成されましたか?場合によっては、崩壊/拡大パネルや同様の機能のためにブール値のフラグ変数などが必要なだけで、グローバル状態(ストア)にする必要はないと思います。それは意味がありません、そうですか? – Ohaha

+0

私は、ステートレスなコンポーネントは、ゼロからロジックがほとんどないプレゼンテーションコンポーネントを対象としていると思います。 Redux/Fluxは、グローバルなアプリケーション状態に関する推論を支援するためのものです。可動部品の少ない部品の場合は、すべての部品をスキップすることをお勧めします。あなたのアプリにレキシックス/フラックスが必要かどうかについては、[Danの素晴らしい投稿](https://medium.com/@dan_abramov/you-might-not-need-redux-be46360cf367)を参照してください。 例では、単一のコンポーネントによってのみ使用される単純なブール型フラグであり、アプリケーション内の他のコンポーネントでは読み取られません。ローカライズされたコンポーネント状態を使用するだけで十分です。 – Siwananda

関連する問題