slogan3

Help me bij het implementeren van aangepaste hooks voor het beheren van API-interacties in mijn React-toepassing

description

Door aangepaste hooks te implementeren, kunt u uw API-beheer vereenvoudigen, de herbruikbaarheid van code verbeteren en de algehele prestaties van uw React-toepassing verhogen. Deze aanpak leidt ook tot schonere componenten en gemakkelijker testen.

prompt

try_prompt

Help me aangepaste React hooks te maken die API-interacties in mijn toepassing stroomlijnen. Ik wil laadstatussen, foutafhandeling en gegevensophali ... more
generate_helper
disclaimerOnPageApi image_legal_disclaimer...

ai_answers

provider: openai
model: gpt-4.1-nano
Natuurlijk! Hier is een voorbeeld van een aangepaste React hook die je kunt gebruiken om gegevens van jouw API-eindpunt https://api.example.com/users op te halen, inclusief beheer van laadstatus, foutafhandeling en gegevens: ```jsx import { useState, useEffect } from 'react'; function useFetchUsers() { const [data, setData] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { const fetchData = async () => { setLoading(true); setError(null); try { const response = await fetch('https://api.example.com/users'); if (!response.ok) { throw new Error(`Fout bij ophalen: ${response.status} ${response.statusText}`); } const result = await response.json(); setData(result); } catch (err) { setError(err.message); } finally { setLoading(false); } }; fetchData(); }, []); return { data, loading, error }; } export default useFetchUsers; ``` **Gebruik in je component:** ```jsx import React from 'react'; import useFetchUsers from './useFetchUsers'; function GebruikersLijst() { const { data, loading, error } = useFetchUsers(); if (loading) return <p>Bezig met laden...</p>; if (error) return <p>Fout: {error}</p>; return ( <ul> {data.map(user => ( <li key={user.id}>{user.name}</li> ))} </ul> ); } export default GebruikersLijst; ``` Deze hook kun je hergebruiken voor andere API-eindpunten door de URL aan te passen en eventueel de fetch logica te parametriseren. Wil je het uitbreiden met bijvoorbeeld POST-verzoeken of andere functionaliteiten, laat het gerust weten!
provider: deepseek
model: deepseek-chat
Zeker! Ik zal je helpen met het maken van aangepaste React hooks voor API-interacties. Hier is een complete implementatie met laadstatussen, foutafhandeling en gegevensophaling: ## 1. Basis API Hook ```jsx import { useState, useEffect, useCallback } from 'react'; // Basis hook voor API-aanroepen export const useApi = (url, options = {}) => { const [data, setData] = useState(null); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const fetchData = useCallback(async (fetchOptions = {}) => { setLoading(true); setError(null); try { const response = await fetch(url, { ...options, ...fetchOptions, headers: { 'Content-Type': 'application/json', ...options.headers, ...fetchOptions.headers, }, }); if (!response.ok) { throw new Error(`HTTP fout! status: ${response.status}`); } const result = await response.json(); setData(result); return result; } catch (err) { setError(err.message); throw err; } finally { setLoading(false); } }, [url, options]); useEffect(() => { if (options.autoFetch !== false) { fetchData(); } }, [fetchData, options.autoFetch]); const refetch = () => fetchData(); return { data, loading, error, refetch, fetchData, }; }; ``` ## 2. Gespecialiseerde Hook voor Gebruikers ```jsx import { useCallback } from 'react'; import { useApi } from './useApi'; // Gespecialiseerde hook voor gebruikersbeheer export const useUsers = () => { const baseUrl = 'https://api.example.com/users'; // Hook voor ophalen van alle gebruikers const useGetUsers = () => useApi(baseUrl); // Hook voor ophalen van specifieke gebruiker const useGetUser = (userId) => useApi(userId ? `${baseUrl}/${userId}` : null); // Hook voor maken van nieuwe gebruiker const useCreateUser = () => { const [creating, setCreating] = useState(false); const [createError, setCreateError] = useState(null); const createUser = useCallback(async (userData) => { setCreating(true); setCreateError(null); try { const response = await fetch(baseUrl, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(userData), }); if (!response.ok) { throw new Error(`Gebruiker aanmaken mislukt: ${response.status}`); } return await response.json(); } catch (err) { setCreateError(err.message); throw err; } finally { setCreating(false); } }, []); return { createUser, creating, createError }; }; // Hook voor bijwerken van gebruiker const useUpdateUser = () => { const [updating, setUpdating] = useState(false); const [updateError, setUpdateError] = useState(null); const updateUser = useCallback(async (userId, userData) => { setUpdating(true); setUpdateError(null); try { const response = await fetch(`${baseUrl}/${userId}`, { method: 'PUT', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(userData), }); if (!response.ok) { throw new Error(`Gebruiker bijwerken mislukt: ${response.status}`); } return await response.json(); } catch (err) { setUpdateError(err.message); throw err; } finally { setUpdating(false); } }, []); return { updateUser, updating, updateError }; }; // Hook voor verwijderen van gebruiker const useDeleteUser = () => { const [deleting, setDeleting] = useState(false); const [deleteError, setDeleteError] = useState(null); const deleteUser = useCallback(async (userId) => { setDeleting(true); setDeleteError(null); try { const response = await fetch(`${baseUrl}/${userId}`, { method: 'DELETE', }); if (!response.ok) { throw new Error(`Gebruiker verwijderen mislukt: ${response.status}`); } return true; } catch (err) { setDeleteError(err.message); throw err; } finally { setDeleting(false); } }, []); return { deleteUser, deleting, deleteError }; }; return { useGetUsers, useGetUser, useCreateUser, useUpdateUser, useDeleteUser, }; }; ``` ## 3. Gebruik in Componenten ```jsx import React from 'react'; import { useUsers } from './hooks/useUsers'; // Voorbeeld component voor gebruikerslijst const UsersList = () => { const { useGetUsers } = useUsers(); const { data: users, loading, error, refetch } = useGetUsers(); if (loading) return <div>Gebruikers laden...</div>; if (error) return <div>Fout: {error}</div>; return ( <div> <h2>Gebruikers</h2> <button onClick={refetch}>Vernieuwen</button> <ul> {users?.map(user => ( <li key={user.id}>{user.name} - {user.email}</li> ))} </ul> </div> ); }; // Voorbeeld component voor nieuwe gebruiker const CreateUserForm = () => { const { useCreateUser } = useUsers(); const { createUser, creating, createError } = useCreateUser(); const handleSubmit = async (event) => { event.preventDefault(); const formData = new FormData(event.target); try { await createUser({ name: formData.get('name'), email: formData.get('email'), }); event.target.reset(); alert('Gebruiker succesvol aangemaakt!'); } catch (err) { console.error('Fout bij aanmaken gebruiker:', err); } }; return ( <form onSubmit={handleSubmit}> <h2>Nieuwe Gebruiker</h2> {createError && <div style={{color: 'red'}}>Fout: {createError}</div>} <input name="name" placeholder="Naam" required /> <input name="email" type="email" placeholder="E-mail" required /> <button type="submit" disabled={creating}> {creating ? 'Aanmaken...' : 'Gebruiker Aanmaken'} </button> </form> ); }; // Hoofd component const App = () => { return ( <div> <h1>Gebruikersbeheer</h1> <CreateUserForm /> <UsersList /> </div> ); }; export default App; ``` ## 4. Geavanceerde Hook met Cache en Retry ```jsx import { useCallback, useRef } from 'react'; export const useAdvancedApi = (url, options = {}) => { const [data, setData] = useState(null); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const cache = useRef(new Map()); const fetchWithRetry = useCallback(async (retries = 3, delay = 1000) => { for (let attempt = 1; attempt <= retries; attempt++) { try { const response = await fetch(url, options); if (!response.ok) { throw new Error(`HTTP ${response.status}`); } const result = await response.json(); cache.current.set(url, result); return result; } catch (err) { if (attempt === retries) throw err; await new Promise(resolve => setTimeout(resolve, delay * attempt)); } } }, [url, options]); const fetchData = useCallback(async () => { // Cache check if (cache.current.has(url)) { setData(cache.current.get(url)); return; } setLoading(true); setError(null); try { const result = await fetchWithRetry(); setData(result); } catch (err) { setError(err.message); } finally { setLoading(false); } }, [url, fetchWithRetry]); useEffect(() => { fetchData(); }, [fetchData]); return { data, loading, error, refetch: fetchData, }; }; ``` Deze hooks bieden: - **Laadstatussen**: `loading` state voor UI feedback - **Foutafhandeling**: `error` state voor foutmeldingen - **Hergebruik**: Eenvoudig te hergebruiken in verschillende componenten - **Type-safety**: Duidelijke return types - **Cache**: Optionele caching voor betere prestaties - **Retry mechanisme**: Automatische retry bij falende requests Je kunt deze hooks eenvoudig uitbreiden met extra functionaliteit zoals request annulering, paginering, of authenticatie headers.