React Query
Pour mettre en cache nos données, nous avons utilisé un object javascript que nous avons appelé let localCache = [] .
En pratique, nous avons souvent besoin de faire bien plus que de la sauvegarde de données uniquement. Parfois, il arrive de modifier les valeurs et de vouloir les mettre dans notre cache également. Il nous faudra pour celà écrire plusieurs lignes de code, alors que React a déjà un outil le gère qui est React-query.
Terminal
npm install @tanstack/react-query@4.28.0
Dans notre dossier helpers, rajoutons un fichier que nous appellerons getImagesApi. Dans le fichier, nous allons créer une fonction que nous pourrons réutiliser à chaque fois que nous avons besoin d'importer les données.
./src/helpers/getImagesApi.js
const getImagesApi = async () => {const apiRep = await fetch("https://mongodb-image-api.vercel.app/api/listCryptoLogo")if (!apiRep.ok) {throw new Error(`impossible d'importer les données`)}return apiRep.json()}export default getImagesApi
A présent, modifions notre hooks useGetImages.js pour utiliser react-query.
./src/hooks/useGetImages.js
import { useQuery } from "@tanstack/react-query"import getImagesApi from "../helpers/getImagesApi"const useGetImages = filter => {return useQuery({queryKey: ["imageData"],queryFn: getImagesApi,select: images =>images.filter(image =>image.currency_code.toLowerCase().includes(filter.toLowerCase()) ||image.currency_long.toLowerCase().includes(filter.toLowerCase())),})}export default useGetImages
Ensuite, nous allons permettre à toute notre application d'avoir accès à React query en modifiant notre fichier App.jsx.
./src/App.jsx
import { createRoot } from "react-dom/client"import { useState } from "react"import SearchFields from "./components/SearchFields"import Crypto from "./components/Crypto"import { BrowserRouter, Routes, Route, Link } from "react-router-dom"import Infos from "./Infos"import { QueryClient, QueryClientProvider } from "@tanstack/react-query"// Create a clientconst queryClient = new QueryClient({defaultOptions: {queries: {staleTime: Infinity,cacheTime: Infinity,},},})const App = () => {const [searchValue, setSearchValue] = useState("")return (<div className="container"><BrowserRouter><Link style={{ textDecoration: "none" }} to="/"><h1 className="title">Crypto Logos</h1></Link><Routes><Route path="/infos/:id" element={<Infos />} /><Routepath="/"element={<><SearchFields searchValue={searchValue} setSearchValue={setSearchValue} /><Crypto searchValue={searchValue} /></>}/></Routes></BrowserRouter></div>)}const container = document.getElementById("app")const root = createRoot(container)root.render(<QueryClientProvider client={queryClient}><App /></QueryClientProvider>)
Modifions ensuite les fichiers Crypto.jsx
./src/components/Crypto.jsx
import ImageBlock from "./ImageBlock"import useGetImages from "../hooks/useGetImages"import { Link } from "react-router-dom"const Crypto = ({ searchValue }) => {const results = useGetImages(searchValue)return (<div className="ListImageContainer">{results.isLoading && <div>Chargement....</div>}{!results.isLoading &&results.data.map(crypto => (<Link key={crypto.currency_long} to={`/infos/${crypto.currency_code}`}><ImageBlock crypto={crypto} /></Link>))}</div>)}export default Crypto
et Info.jsx :
./src/infos.jsx
import { useParams } from "react-router-dom"import useGetImages from "./hooks/useGetImages"const Infos = () => {const { id } = useParams()const results = useGetImages(id)return !results.isLoading ? (results.data.length > 0 ? (<divstyle={{display: "flex",justifyContent: "center",marginTop: "2rem",}}><divstyle={{display: "flex",border: "solid 1px #D7D7D7",borderRadius: "8px",padding: "1rem",alignItems: "center",backgroundColor: "#F2F2F2",}}><img src={results.data[0].link} alt={results.data[0].currency_long} /><div style={{ paddingLeft: "1rem" }}><p>Nom: <b>{results.data[0].currency_long}</b></p><p>Code: <b>{results.data[0].currency_code}</b></p></div></div></div>) : (<div>Le code n'existe pas</div>)) : (<div>Chargement...</div>)}export default Infos
Relançons notre application, elle devrait de nouveau fonctionner normalement. Pour plus d'informations sur React-query, n'hésitez pas à aller jeter un coup d'oeil à leur documentation.
13-Query
- src
- components
- Crypto.jsx
- ImageBlock.jsx
- SearchFields.jsx
- helpers
- filterfunc.js
- getImagesApi.js
- hooks
- useGetImages.js
- App.jsx
- index.html
- Infos.jsx
- style.css
- components
- .eslintrc.json
- .gitignore
- .package.json
- .prettierrc
- vite.config.js
Aucune sélection
Sélectionner un fichier