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} />);
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 />);
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} />);
Ă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 />);
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.