Faire un Component SearchBar adaptable à tout type de données - Reactjs
June 16, 2022
Si vous êtes perdu ou que vous avez un doute, à tout moment vous pouvez vérifier si tout est en ordre depuis ce répo github
Etape 1 : Initialisation du projet ! 🔥
Si vous partez de zéro commencez par lancer la commande create-react-app suivi du nom du votre projet depuis votre terminal :
npx create-react-app searchbar-component
Parfait maintenant qu’on est prêt on va tout d’abord afficher nos données, par exemple voilà deux types de données que vous pouvez préparer et afficher avec un .map !
// App.js
...
function App() {
const dataArray = [
"John",
"Mark",
"Antoine",
"Fabrice",
"Laura",
"Fabienne",
"Thomas",
"Léa",
];
const dataObjects = [
{ name: "John", details: { age: 32, type: "gentil" } },
{ name: "Mark", details: { age: 12, type: "cool" } },
{ name: "Antoine", details: { age: 65, type: "gentil" } },
{ name: "Fabrice", details: { age: 6, type: "flemmard" } },
{ name: "Laura", details: { age: 31, type: "costaud" } },
{ name: "Fabienne", details: { age: 54, type: "gentil" } },
{ name: "Thomas", details: { age: 26, type: "flemmard" } },
{ name: "Léa", details: { age: 62, type: "costaud" } },
];
const [data, setData] = useState(dataArray)
const [data2, setData2] = useState(dataObjects)
return (
<div className="App">
<div>
<h1>Data Array</h1>
{data.map((item, index) => <p key={index}>{item}</p>)}
</div>
<div>
<h1>Data Objects</h1>
{data2.map((item, index) => <p key={index}>{item.name} | {item.details.age} ans | {item.details.type}</p>)}
</div>
</div>
);
}
export default App;
Ok si tout s’est bien passé vous affichez maintenant les données des deux différentes listes bravo 😉
Etape 2 : Création du Component SearchBar ! 🔍
Ca y est c’est déjà l’heure de créer votre petit component !
Vous pouvez par exemple le créer à l’emplacement src/SearchBar.js
Le component aura besoin de 3 Props :
- list : la liste à filtrer
- setList : La fonction de callback qui permet de faire l’update en fonction de la recherche
- filterField : Encore une fonction de callback qui va nous permettre de choisir sur quel champs filtrer en cas de liste d’objet ! On peut laisser cette propriété vide et elle sera par défaut adaptée à une liste de String (dataArray)
// SearchBar.js
import React, { useEffect, useState } from 'react'
const SearchBar = ({list, setList, filterField = item => item, ...props}) => {
...
Bon c’est bien beau mais maintenant il faut faire quelque chose de ces propriétés, allez on continue voici le component complet :
// SearchBar.js
import React, { useEffect, useState } from 'react'
const SearchBar = ({list, setList, filterField = item => item, ...props}) => {
const [value, setValue] = useState("")
useEffect(() => {
if (value) {
setList(filterList())
}
else {
setList(list)
}
}, [value])
const filterList = () => {
return list.filter(item => filterField(item).toLowerCase().includes(value.toLocaleLowerCase()))
}
const handleChange = event => {
setValue(event.target.value)
}
return (
<input type="text" placeholder="search ..." name="search" onChange={handleChange} value={value} {...props}/>
)
}
export { SearchBar };
C’est tout ? Et oui il n’en faut pas plus pour filtrer nos données ! Ce qui se passe :
- Dès que notre input change, on met la valeur (value) de la recherche à jour
- Lorsque value change on filtre de nouveau la listedans le useEffect
- La fonction filterList nous renvoie la liste de base filtrée avec notre fonction de callback filterField
- Et c’est filtré !
Etape 3 : Utilisation du Component SearchBar 🌟
Oui c’est finit mais c’est pas non plus finit il faut encore que je vous montre comment utiliser le component depuis App.js juste au cas où !
⚠ Attention à bien passer une liste fixe en propriété et pas celle du state par exemple
// App.js
...
return (
<div className="App">
<div>
<h1>Data Array</h1>
<SearchBar list={dataArray} setList={setData}/>
{data.map((item, index) => <p key={index}>{item}</p>)}
</div>
<div>
<h1>Data Objects</h1>
{/* <SearchBar placeholder={"filter by age"} filterField={(item) => item.details.age.toString()} list={dataObjects} setList={setData2}/> */}
{/* <SearchBar placeholder={"filter by name"} filterField={(item) => item.name} list={dataObjects} setList={setData2}/> */}
<SearchBar placeholder={"filter by type"} filterField={(item) => item.details.type} list={dataObjects} setList={setData2} style={{width:"100%"}}/>
{data2.map((item, index) => <p key={index}>{item.name} | {item.details.age} ans | {item.details.type}</p>)}
</div>
</div>
);
Et voilà je vous ai mis quelques exemples d’utilisation, à vous de jouer pour styliser tout ça et l’adapter à vos besoins 😉