109 votes

Instruction if-else dans jsx : ReactJS

J'ai besoin de changer la fonction de rendu et de lancer une sous-fonction de rendu 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 mettre en œuvre cela sans modifier les scènes, je vais utiliser des onglets pour changer le contenu dynamiquement.

191voto

Mayank Shukla Points 39317

Conformément à DOC :

Les instructions if-else ne fonctionnent pas dans JSX. C'est parce que JSX est juste sucre syntaxique pour les appels de fonctions et la construction d'objets.

Règle de base :

JSX est fondamentalement sucre syntaxique . Après la compilation, les expressions JSX deviennent des appels de fonctions JavaScript ordinaires et sont évaluées en objets JavaScript. Nous pouvons intégrer n'importe quel Expression JavaScript en JSX en l'entourant d'accolades.

Mais seulement des expressions et non des déclarations, ce qui signifie que nous ne pouvons pas mettre directement une déclaration ( if-else/switch/for ) à l'intérieur JSX .


Si vous voulez rendre l'élément de manière conditionnelle, utilisez alors ternary operator comme ceci :

render() {
    return (   
        <View style={styles.container}>
            {this.state.value == 'news'? <Text>data</Text>: null }
        </View>
    )
}

Une autre option consiste à appeler une fonction de jsx et mettre tous les if-else logique à l'intérieur de ça, comme ça :

renderElement(){
   if(this.state.value == 'news')
      return <Text>data</Text>;
   return null;
}

render() {
    return (   
        <View style={styles.container}>
            { this.renderElement() }
        </View>
    )
}

0 votes

Puis-je faire comme ça ? render() { return ( <View style={styles.container}> if (this.state == 'news'){ return ( <Text>data</Text> ) } }

0 votes

Donc un retour à l'intérieur d'un retour est possible ? ou deux retours différents dans la même scène de fonction de rendu, je dois changer le sous contenu du retour.

0 votes

Oui c'est possible mais, d'une manière différente directement nous ne pouvons pas utiliser if/else dans JSX donc utiliser l'opérateur ternaire pour les conditions, utiliser ceci : render() { return ( <View style={styles.container}> {this.state == 'news' ? <Text>data</Text> : null } </View> ) }

31voto

sooper Points 2987

Je trouve que cette façon de faire est la plus agréable :

{this.state.yourVariable === 'news' && <Text>{data}<Text/>}

3 votes

Je suis d'accord, c'est le plus beau du groupe. Retour à null avec un opérateur ternaire est inutile ;)

0 votes

Ceci devrait être ajouté à la réponse principale.

0 votes

Comment pourrais-je l'utiliser dans mon cas ? Si je l'utilise comme ceci {localStorage.getItem('token') && <Typography>Invalid Login</Typography>} il sera rendu avant même que le formulaire ne soit soumis. stackoverflow.com/questions/60577971/

14voto

Manish Points 349

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

1 votes

@Pierre.Vriens Au lieu de if-else, vous pouvez utiliser des opérateurs ternaires dans la méthode render(). Syntaxe : - condition ? expr1 : expr2 Ex. if (this.state.status === true) { } else { }

3voto

Chase Sandmann Points 428

Il existe un plugin Babel qui vous permet d'écrire des déclarations conditionnelles à l'intérieur de JSX sans avoir besoin de les échapper avec JavaScript ou d'écrire une classe wrapper. Il s'appelle Déclarations de contrôle JSX :

<View style={styles.container}>
  <If condition={ this.state == 'news' }>
    <Text>data</Text>
  </If>
</View>

Il nécessite un peu de mise en place en fonction de votre configuration Babel, mais vous n'avez pas besoin d'importer quoi que ce soit et il présente tous les avantages du rendu conditionnel sans quitter JSX, ce qui donne à votre code un aspect très propre.

3voto

Jagjot Singh Points 2108

Vous pouvez 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 de récupération de 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>
    }
}

0 votes

Pouvez-vous me montrer un exemple complet de fonctionnement, désolé, je suis nouveau dans ce domaine.

0 votes

@user8026867 exemple ajouté

0 votes

Je veux retourner de l'intérieur d'une fonction

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X