2017-06-26 5 views
0

Lorsque vous essayez de définir un tableau non vide comme une propriété de l'État composant (à l'initialisation, dans le constructeur de composants), comme par exemple:Affectation d'un tableau en tant que propriété d'état de composant de réaction?

this.state = { results: ['apple','orange'] } //in the component constructor 

cette erreur est renvoyée dans la console:

dans cet environnement, les sources pour Assigner DOIVENT être une erreur object.This est une optimisation des performances et non conformes spec

Si le tableau est vide cependant, que fonctionne (mais dès que vous essayez de réaffecter un tableau non vide, il bug)

Alors cela fonctionne:

this.state = { results: [] } //in the component constructor 

jusqu'à ce que vous

this.setState({results: ['apple','orange'] }) //in a component function 

à point auquel l'erreur précédente serait retourné ...

Je ne comprends pas. Les tableaux javascript ne sont-ils pas supposés être de l'objet type et donc utilisables comme valeur de propriété d'état?

Je l'ai testé avec la dernière version réag-native (0.45.1), sur un appareil Android.

L'objet state.results est utilisé que dans un listview comme celui-ci:

const ds = new ListView.DataSource({ rowHasChanged: (r1, r2) => r1 !== r2 }) 

    render() { 
    return (

    <ListView 
       style={{position: 'absolute', width: 100, backgroundColor: 'white', zIndex: 3}} 
       keyboardShouldPersistTaps='always' 
       initialListSize={15} 
       enableEmptySections={true} 
       dataSource={ds.cloneWithRows(this.state.results)} 
       renderRow={(rowData, sectionId, rowId, highlightRow) => 
       <RowWrapper styles={styles.rowWrapper} > 
        <TouchableOpacity 
        activeOpacity={0.5} 
        onPress={() => {this.onItemPress(this.state.results[rowId])}} 
        > 
        <Text style={styles.rowText}>{rowData}</Text> 
        </TouchableOpacity> 
       </RowWrapper> 
       } 
      /> 
    ) 
    } 

    class RowWrapper extends Component { 
     constructor (props) { 
     super(props) 
     this.defaultTransitionDuration = 500 
     this.state = { 
      opacity: new Animated.Value(0) 
     } 
     } 
     componentDidMount() { 
     Animated.timing(this.state.opacity, { 
      toValue: 1, 
      duration: this.defaultTransitionDuration 
     }).start() 
     } 
     render() { 
     return (
      <TouchableWithoutFeedback> 
      <Animated.View style={{...this.props.styles, opacity: this.state.opacity }}> 
       {this.props.children} 
      </Animated.View> 
      </TouchableWithoutFeedback> 
     ) 
     } 
    } 
+0

Hey, pouvez-vous envoyer plus de code? Ce que vous avez posté devrait fonctionner correctement, donc je crois que l'erreur est due à quelque chose d'autre dans votre code. btw utilisez-vous Object.assign n'importe où ou postez où vous utilisez this.state.results. merci –

+0

@MattAft. J'ai édité mon premier post avec la partie du code où j'utilise this.state.results. Je n'utilise pas Object.assign n'importe où et la listview est la seule partie de mon code où this.state.results est lu (sinon il n'apparaît que dans le constructeur du composant avec this.state = {results: []} et dans un fonction component où elle est écrasée avec this.setState ({results: ['apple', 'orange']}) mais c'est là que le problème se produit ...) –

Répondre

0

Vous ne devriez pas muter l'état. au lieu de faire

this.setState({results: ['apple','orange'] }) 

Vous devriez faire

var resultsArr = this.state.results.slice(); 
var newResults = ['apple','orange']; 
resultsArr.concat(newResults); or resultsArr.push(newResults); 
this.setState({results: resultsArr }) 
+0

Je ne mute pas l'état directement comme je l'appelle .setState() qui est censé fusionner ce qui est passé en argument avec l'état du composant ... Je ne vois pas quelle est la différence entre faire: var newResults = ['apple', 'orange']; this.setState ({results: newResults}) directement et var resultsArr = this.state.results.slice(); var newResults = ['pomme', 'orange']; resultsArr.concat (newResults); this.setState ({results: resultsArr}) Exept faire un tableau temporaire vide inutile ... –

+0

Quoi qu'il en soit votre code ne résout pas le problème et comme je l'ai dit, l'erreur se produit si je initie directement une propriété d'état avec un non tableau vide aussi. Donc ce n'est pas lié à la mutation de l'état ou non ... –

+0

Pouvez-vous essayer ceci: 'this.setState ({results: [this.state.results.concat ['apple', 'orange']]}) ' Avec es6 ' this.setState ({results: [... this.state.results, ... ['apple', 'orange']] }) ' – Etherealm