L’objectif de ce chapitre est de vous expliquer comment créer une “boite modale”, ici un petit formulaire qui s’ouvre à la demande, permettant de saisir ses coordonnées.
Créez une application React.js de base, qui affiche un petit message de type It’s working!!.
Créez un fichier src/Modal.js dans lequel placer le code suivant, qui permet l’affichage d’un formulaire de saisie :
import React from "react";
export default function Modal(props) {
function close() {
console.log("close");
}
return (
<div>
<h1>Adding a new Person</h1>
<form id='personForm' onSubmit={e => props.addPerson(e)}>
<p>name<br/><input placeholder="Enter name" name="name" required="required"/></p>
<p>password
<br/><input type="password" name="password" required="required"/></p>
<div id="buttons">
<button type="submit">OK</button>
<button type="button" onClick={close}>Cancel</button>
</div>
</form>
</div>
);
}
Ce formulaire fait appel à deux fonctions :
close est une fonction du formulaire, elle servira à refermer le formulaire. Pour le moment, on se limite au renvoi d’un message dans la console.addPerson est une fonction qui est passée en argument du composant <Modal>. Il doit donc être associé à l’appel de ce composant dans le composant appelant, dans notre cas, c’est le composant <App>.Modifiez la fonction App (dans le fichier src/App.js) comme suit :
function App() {
function addPerson(e) {
e.preventDefault();
console.log('Add person !!', e.target.name.value);
}
return (
<>
<p> It's working !!</p>
<div id="personModal">
<Modal addPerson={addPerson} buttonOpen={buttonOpen}/>
</div>
</>
);
}
addPerson se contente pour le moment d’écrire un message dans la console.addPerson est passée en argument au composant <Modal>, qui peut donc l’utiliser.Ajoutez le code suivant dans votre feuille de style :
#personModal {
display: none;
/* Hidden by default */
position: fixed;
/* Stay in place */
z-index: 1;
/* Sit on top */
left: 0;
top: 0;
width: 100%;
/* Full width */
height: 100%;
/* Full height */
overflow: auto;
/* Enable scroll if needed */
background-color: rgb(0, 0, 0);
/* Fallback color */
background-color: rgba(0, 0, 0, 0.4);
/* Black w/ opacity */
}
display:none.Pour ouvrir le formulaire, il va falloir :
<App>App est donc modifié comme suit :function App() {
const buttonOpen = useRef(null);
const modalElement = useRef(null);
...
return (
<>
<div>
Pour ouvrir le formulaire
<button type="button" ref={buttonOpen}> cliquez ici</button>
</div>
<div id="personModal" ref={modalElement}>
<Modal addPerson={addPerson} buttonOpen={buttonOpen} modalElement={modalElement}/>
</div>
</>
);
}
getElementById(...) et donc de générer un code très difficile à maintenir.Le formulaire reçoit ici la référence au bouton qui doit l’ouvrir, c’est dans la définition du formulaire que l’on définit l’action qui permet au formulaire de devenir visible. Dans la fonction Modal, on ajoute donc le code suivant :
function open() {
console.log("open");
}
useEffect(() => {
props.buttonOpen.current.onclick = open;
});
useEffect s’exécute à l’affichage du formulaire (même si son style est display:none). Cela permet d’associer une action à l’évènement click sur le bouton. Remarquez la syntaxe onclick avec un c minuscule.open affiche un message dans la console, pour le moment le formulaire n’apparaît toujours pas!!Il reste aux fonctions open et close à agir sur le style pour que le formulaire puisse apparaître et disparaître à souhait :
function close() {
props.modalElement.current.style.display = 'none';
}
function open() {
props.modalElement.current.style.display = 'block';
}Votre formulaire apparaît ou disparaît maintenant comme attendu. Seul le bouton OK ne fonctionne pas encore. Modifiez-le comme suit :
function addPerson(e) {
e.preventDefault();
console.log('Add person !!', e.target.name.value);
modalElement.current.style.display = 'none';
}