2017-06-08 2 views
0

enter code here Ich habe versucht, die Wheel Picker Komponente zu meinem Projekt hinzuzufügen. Es funktioniert gut, wenn es in der zustandsbehafteten Komponente bedeckt.So versuchte ich, es in zustandslose Komponente zu konvertieren, wenn ich das Rad blättern, indexiert den ausgewählten Index immer auf den Standardwert (Bsp .: wenn ich zu Element Nummer 10 blättern, und das Rad automatisch blättern zurück auf Standard 0), obwohl ich die richtigen Werte erhalte. Stimmt etwas nicht mit meiner Komponente?Alternative des Zustands in zustandslosen Komponente

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; 

Ich habe die Komponente wie folgt aus:

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

Sie bei der Integration redux in Ihre Anwendung aussehen sollte, so dass die Komponentenwerte von Requisiten, anstatt Zustand zeigen. –

+0

Können wir statusfreie Komponenten und Redux verwenden, um alle statusbehafteten Komponenten zu ersetzen? In einigen Fällen habe ich das Gefühl, dass das Schreiben von Aktionen und das Verwenden des globalen Zustands (Speichern) komplexer ist als die Verwendung der statusbehafteten Komponente. – Ohaha

+0

Es ist situationsbedingt - wenn eine Komponente keine Daten mit anderen Komponenten teilen muss, dann hat es keinen Sinn, sie dem globalen Speicher hinzuzufügen. –

Antwort

0

Dies liegt daran, Sie versuchen, props zu ändern, die vom übergeordneten Element weitergegeben wird immer. I.e. In einer zustandslosen Komponente ist der übergebene Parameter die Requisiten. Requisiten sind nur lesbar (https://facebook.github.io/react/docs/components-and-props.html#props-are-read-only)

Sie versuchen auch, Werte innerhalb der Renderfunktion zu aktualisieren, die möglicherweise im Zustand der Komponente leben können. In diesem speziellen Szenario versuchen Sie, den Inhalt von selectedItems zu ändern, was eine Requisite ist, die an Ihre Komponente weitergegeben wird.

Um den Inhalt von selectedItems zu aktualisieren, wäre es besser, selectedItems wie der Zustand in der übergeordneten Komponente zu halten und verwenden setState die Werte zu aktualisieren (dies ist wahrscheinlich die ursprüngliche Ansatz, da Sie erwähnten „Es funktioniert gut, wenn bedecken sie es in der Stateful-Komponente ")

Zum Beispiel

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)}/> 
    ) 
    } 
} 

auf diese Weise Ihre WheelTimePicker Komponente kann staatenlos sein. Und in Ihrem Picker, wahrscheinlich müßte es ein wenig so etwas wie anzupassen:

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

Sie haben Recht. Ich habe nur verwirrt über das Konzept der staatenlosen Komponente. Wurde die staatenlose Komponente und redux geschaffen, um die zustandsbehaftete Komponente vollständig zu ersetzen? In einigen Fällen benötige ich nur eine boolesche Flag-Variable oder etwas Ähnliches für das Reduzieren/Erweitern-Panel oder eine ähnliche Funktion, und ich denke, dass es nicht notwendig ist, sie in den globalen Zustand (Speicher) zu bringen. Es ergibt keinen Sinn, oder? – Ohaha

+0

Ich würde denken, dass zustandslose Komponenten für Präsentationskomponenten gedacht sind, die wenig Logik haben. Redux/Flux soll das Nachdenken über den globalen Anwendungszustand erleichtern. Bei Bauteilen mit wenig beweglichen Teilen ist das Überspringen von Redox insgesamt eine gute Idee. Sehen Sie [Dans großartige Nachricht] (https://medium.com/@dan_abramov/you-might-not-need-redux-be46360cf367), ob Sie Redux/Flux in Ihrer App benötigen. In Ihrem Beispiel, wenn es ein einfaches boolesches Flag ist, das nur von einer einzelnen Komponente verwendet würde, die von keiner anderen Komponente in der Anwendung gelesen wird; lokalisierter Komponentenstatus ist ausreichend. – Siwananda

Verwandte Themen