J'ai besoin de changer la fonction de rendu et d'exécuter une fonction de rendu secondaire lorsqu'un état spécifique est donné,
Par exemple:
render() {
return (
<View style={styles.container}>
if (this.state == 'news'){
return (
<Text>data</Text>
)
}
</View>
)
}
Comment puis-je implémenter cela sans changer de scène, je vais utiliser des onglets pour changer le contenu de manière dynamique.
Selon DOC:
les instructions if-else ne fonctionnent pas dans JSX. En effet, JSX n’est qu’un sucre syntaxique pour les appels de fonctions et la construction d’objets.
Règle basique:
JSX est fondamentalement sucre syntaxique . Après la compilation, les expressions JSX deviennent des appels de fonction JavaScript normaux et sont évaluées en objets JavaScript. Nous pouvons incorporer n'importe quelle expression JavaScript dans JSX en l'enveloppant entre accolades.
Mais seulement des expressions, pas des déclarations, signifie directement que nous ne pouvons mettre aucune déclaration ( si-sinon/switch/for ) à l'intérieur de JSX .
Si vous voulez rendre l'élément de façon conditionnelle, utilisez ternary operator
, comme ceci:
render() {
return (
<View style={styles.container}>
{this.state.value == 'news'? <Text>data</Text>: null }
</View>
)
}
Une autre option est d'appeler une fonction de jsx
et de mettre toute la logique if-else
à l'intérieur, comme ceci:
renderElement(){
if(this.state.value == 'news')
return <Text>data</Text>;
return null;
}
render() {
return (
<View style={styles.container}>
{ this.renderElement() }
</View>
)
}
J'aime ça et ça marche bien.
constructor() {
super();
this.state ={
status:true
}
}
render() {
return(
{ this.state.status === true ?
<TouchableHighlight onPress={()=>this.hideView()}>
<View style={styles.optionView}>
<Text>Ok Fine :)</Text>
</View>
</TouchableHighlight>
:
<Text>Ok Fine.</Text>
}
);
}
hideView(){
this.setState({
home:!this.state.status
});
}
Je trouve que cette voie est la plus gentille:
{this.state.yourVariable === 'news' && <Text>{data}<Text/>}
Un plugin Babel vous permet d'écrire des instructions conditionnelles dans JSX sans avoir besoin de les échapper avec JavaScript ou d'écrire une classe wrapper. Cela s'appelle Commandes JSX :
<View style={styles.container}>
<If condition={ this.state == 'news' }>
<Text>data</Text>
</If>
</View>
Cela prend un peu de configuration en fonction de votre configuration Babel, mais vous n’aurez rien à importer et il offre tous les avantages du rendu conditionnel sans quitter JSX, ce qui laisse votre code très propre.
Tu peux le faire. N'oubliez pas de mettre "return" avant votre composant JSX.
Exemple:
render() {
if(this.state.page === 'news') {
return <Text>This is news page</Text>;
} else {
return <Text>This is another page</Text>;
}
}
Exemple pour récupérer des données sur Internet:
import React, { Component } from 'react';
import {
View,
Text
} from 'react-native';
export default class Test extends Component {
constructor(props) {
super(props);
this.state = {
bodyText: ''
}
}
fetchData() {
fetch('https://example.com').then((resp) => {
this.setState({
bodyText: resp._bodyText
});
});
}
componentDidMount() {
this.fetchData();
}
render() {
return <View style={{ flex: 1 }}>
<Text>{this.state.bodyText}</Text>
</View>
}
}
render() {
return (
<View style={styles.container}>
(() => {
if (this.state == 'news') {
return <Text>data</Text>
}
else
return <Text></Text>
})()
</View>
)
}
D'habitude, je fais ça:
_renderNews () {
if (this.state.page === 'news') {
return <Text>{data}</Text>
}
return null
}
render () {
return (
<View>{this._renderNews}</View>
)
}
Qu'en est-il de switch case au lieu de if-else
render() {
switch (this.state.route) {
case 'loginRoute':
return (
<Login changeRoute={this.changeRoute}
changeName={this.changeName}
changeRole={this.changeRole} />
);
case 'adminRoute':
return (
<DashboardAdmin
role={this.state.role}
name={this.state.name}
changeRoute={this.changeRoute}
/>
);
}
Pour cela, nous pouvons utiliser l'opérateur ternaire ou, s'il n'y a qu'une seule condition, l'opérateur "&&" .Comme ceci: -
//This is for if else
render() {
return (
<View style={styles.container}>
{this.state == 'news') ?
<Text>data</Text>
: null}
</View>
)
}
//This is only for if or only for one condition
render() {
return (
<View style={styles.container}>
{this.state == 'news') &&
<Text>data</Text>
}
</View>
)
}
if(condition1){ image1
}esleif(condition2){ image2
}else{ image3
}
Pour des conditions multiples comme ci-dessus, vérifiez le code mentionné ci-dessous,
render(){
return(
{
(condition1)?
<Image source={require('')}/>:
(condition2)?
<Image source={require('')}/>:
<Image source={require('')}/>:
}
);}
Vous ne pouvez pas fournir la condition if-else dans le bloc de retour, utiliser le bloc ternaire, this.state sera un objet, vous ne devriez pas le comparer avec une valeur, voir quelle valeur d'état vous voulez vérifier, aussi return renvoie un seul élément, assurez-vous de les envelopper dans une vue.
render() {
return (
<View style={styles.container}>
{this.state.page === 'news'? <Text>data</Text>: null}
</View>
)
}