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>
)
}
}
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 –
@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 ...) –