We want to hear from you!Take our 2021 Community Survey!
This site is no longer updated.Go to react.dev

Affichage conditionnel

These docs are old and won’t be updated. Go to react.dev for the new React docs.

These new documentation pages teach modern React and include live examples:

En React, vous pouvez concevoir des composants distincts qui encapsulent le comportement voulu. Vous pouvez alors n’afficher que certains d’entre eux, suivant l’état de votre application.

L’affichage conditionnel en React fonctionne de la mĂȘme façon que les conditions en Javascript. On utilise l’instruction Javascript if ou l’opĂ©rateur ternaire pour crĂ©er des Ă©lĂ©ments reprĂ©sentant l’état courant, et on laisse React mettre Ă  jour l’interface utilisateur (UI) pour qu’elle corresponde.

ConsidĂ©rons ces deux composants :

function UserGreeting(props) {
  return <h1>Bienvenue !</h1>;
}

function GuestGreeting(props) {
  return <h1>Veuillez vous inscrire.</h1>;
}

Nous allons crĂ©er un composant Greeting qui affiche un de ces deux composants, selon qu’un utilisateur est connectĂ© ou non :

function Greeting(props) {
  const isLoggedIn = props.isLoggedIn;
  if (isLoggedIn) {    return <UserGreeting />;  }  return <GuestGreeting />;}
const root = ReactDOM.createRoot(document.getElementById('root')); 
// Essayez de changer ça vers isLoggedIn={true} :
root.render(<Greeting isLoggedIn={false} />);

Essayer sur CodePen

Cet exemple affiche un message différent selon la valeur de la prop isLoggedIn.

Variables d’élĂ©ments

Vous pouvez stocker les Ă©lĂ©ments dans des variables. Ça vous aide Ă  afficher de façon conditionnelle une partie du composant tandis que le reste ne change pas.

Prenons ces deux nouveaux composants, qui reprĂ©sentent les boutons de DĂ©connexion et de Connexion :

function LoginButton(props) {
  return (
    <button onClick={props.onClick}>
      Connexion
    </button>
  );
}

function LogoutButton(props) {
  return (
    <button onClick={props.onClick}>
      Déconnexion
    </button>
  );
}

Dans l’exemple ci-dessous, nous allons crĂ©er un composant Ă  Ă©tat appelĂ© LoginControl.

Il affichera soit <LoginButton />, soit <LogoutButton />, selon son Ă©tat courant. Il affichera aussi un <Greeting /> de l’exemple prĂ©cĂ©dent :

class LoginControl extends React.Component {
  constructor(props) {
    super(props);
    this.handleLoginClick = this.handleLoginClick.bind(this);
    this.handleLogoutClick = this.handleLogoutClick.bind(this);
    this.state = {isLoggedIn: false};
  }

  handleLoginClick() {
    this.setState({isLoggedIn: true});
  }

  handleLogoutClick() {
    this.setState({isLoggedIn: false});
  }

  render() {
    const isLoggedIn = this.state.isLoggedIn;
    let button;
    if (isLoggedIn) {      button = <LogoutButton onClick={this.handleLogoutClick} />;    } else {      button = <LoginButton onClick={this.handleLoginClick} />;    }
    return (
      <div>
        <Greeting isLoggedIn={isLoggedIn} />        {button}      </div>
    );
  }
}

const root = ReactDOM.createRoot(document.getElementById('root')); 
root.render(<LoginControl />);

Essayer sur CodePen

MĂȘme si dĂ©clarer une variable et utiliser une instruction if reste une bonne façon d’afficher conditionnellement un composant, parfois vous voudrez peut-ĂȘtre utiliser une syntaxe plus concise. Nous allons voir, ci-dessous, plusieurs façons d’utiliser des conditions Ă  la volĂ©e en JSX.

Condition Ă  la volĂ©e avec l’opĂ©rateur logique &&

Vous pouvez utiliser n’importe quelle expression dans du JSX en l’enveloppant dans des accolades. Ça vaut aussi pour l’opĂ©rateur logique Javascript &&. Il peut ĂȘtre pratique pour inclure conditionnellement un Ă©lĂ©ment :

function Mailbox(props) {
  const unreadMessages = props.unreadMessages;
  return (
    <div>
      <h1>Bonjour !</h1>
      {unreadMessages.length > 0 &&        <h2>          Vous avez {unreadMessages.length} message(s) non-lu(s).        </h2>      }    </div>
  );
}

const messages = ['React', 'Re: React', 'Re:Re: React'];

const root = ReactDOM.createRoot(document.getElementById('root')); 
root.render(<Mailbox unreadMessages={messages} />);

Essayer sur CodePen

Ça fonctionne parce qu’en JavaScript, true && expression est toujours Ă©valuĂ© Ă  expression, et false && expression est toujours Ă©valuĂ© Ă  false.

Du coup, si la condition vaut true, l’élĂ©ment juste aprĂšs && sera affichĂ©. Si elle vaut false, React va l’ignorer et le sauter.

Note that returning a falsy expression will still cause the element after && to be skipped but will return the falsy expression. In the example below, <div>0</div> will be returned by the render method.

render() {
  const count = 0;  return (
    <div>
      {count && <h1>Messages: {count}</h1>}    </div>
  );
}

Alternative à la volée avec opérateur ternaire

Une autre mĂ©thode pour l’affichage conditionnel Ă  la volĂ©e d’élĂ©ments consiste Ă  utiliser l’opĂ©rateur ternaire Javascript condition ? trueValue : falseValue.

Dans l’exemple ci-dessous, on l’utilise pour afficher conditionnellement un bloc de texte.

render() {
  const isLoggedIn = this.state.isLoggedIn;
  return (
    <div>
      L’utilisateur <b>{isLoggedIn ? 'est actuellement' : 'n’est pas'}</b> connectĂ©.    </div>
  );
}

On peut aussi l’utiliser pour des expressions plus longues, mĂȘme si c’est moins clair :

render() {
  const isLoggedIn = this.state.isLoggedIn;
  return (
    <div>
      {isLoggedIn        ? <LogoutButton onClick={this.handleLogoutClick} />
        : <LoginButton onClick={this.handleLoginClick} />      }
    </div>  );
}

Tout comme en Javascript, c’est Ă  vous de choisir un style appropriĂ© selon les prĂ©fĂ©rences de lisibilitĂ© en vigueur pour vous et votre Ă©quipe. Souvenez-vous aussi que chaque fois que des conditions deviennent trop complexes, c’est peut-ĂȘtre le signe qu’il serait judicieux d’en extraire un composant.

EmpĂȘcher l’affichage d’un composant

Dans de rares cas, vous voudrez peut-ĂȘtre qu’un composant se masque alors mĂȘme qu’il figure dans le rendu d’un autre composant. Pour ce faire, il suffit de renvoyer null au lieu de son affichage habituel.

Dans l’exemple ci-dessous, <WarningBanner /> s’affichera en fonction de la valeur de la prop warn. Si la valeur est false, le composant ne s’affiche pas :

function WarningBanner(props) {
  if (!props.warn) {    return null;  }
  return (
    <div className="warning">
      Attention !
    </div>
  );
}

class Page extends React.Component {
  constructor(props) {
    super(props);
    this.state = {showWarning: true};
    this.handleToggleClick = this.handleToggleClick.bind(this);
  }

  handleToggleClick() {
    this.setState(state => ({
      showWarning: !state.showWarning
    }));
  }

  render() {
    return (
      <div>
        <WarningBanner warn={this.state.showWarning} />        <button onClick={this.handleToggleClick}>
          {this.state.showWarning ? 'Masquer' : 'Afficher'}
        </button>
      </div>
    );
  }
}

const root = ReactDOM.createRoot(document.getElementById('root')); 
root.render(<Page />);

Essayer sur on CodePen

Renvoyer null depuis la mĂ©thode render d’un composant n’affecte pas l’appel aux mĂ©thodes du cycle de vie du composant. Par exemple, componentDidUpdate sera quand mĂȘme appelĂ©e.

Avez-vous trouvĂ© cette page utile ?Modifier cette page