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