Een foutmelding lezen
Een foutmelding is geen straf, maar een hint. De computer vertelt je wat er mis is, en vaak ook waar.
Waar zie je de foutmelding?
- Browser:
F12→ tabje Console - Vite: een rood scherm over je pagina, of de terminal waar
npm run devdraait
Zo pak je het aan
- Lees de eerste rode regel. Die zegt wat er mis is
- Zoek de bestandsnaam en het regelnummer, bijv.
App.jsx:12. Daar zit de fout (of net een regel erboven) - Zoek je foutmelding hieronder op
Cannot read properties of undefined (map)
Uncaught TypeError: Cannot read properties of undefined (reading 'map')
Wat betekent het? Je doet .map() op iets dat (nog) niet bestaat. Meestal is je data nog niet geladen: de eerste keer dat je component rendert, is de fetch nog bezig.
Fout:
const [products, setProducts] = useState();
return products.map((p) => <p key={p.id}>{p.name}</p>);
Goed:
const [products, setProducts] = useState([]); // begin met lege array
return products.map((p) => <p key={p.id}>{p.name}</p>);
Nog steeds?
Check met console.log(data) wat de API teruggeeft. Vaak zit de array ín een object, dan moet het setProducts(data.products) zijn.
unique "key" prop
Each child in a list should have a unique "key" prop.
Wat betekent het? Bij .map() moet elk element een unieke key hebben, zodat React weet welk item welk is.
Fout:
{todos.map((todo) => (
<li>{todo.title}</li>
))}
Goed:
{todos.map((todo) => (
<li key={todo.id}>{todo.title}</li>
))}
Zet de key op het buitenste element in je .map(). Gebruik bij voorkeur een id uit je data.
Too many re-renders
Too many re-renders. React limits the number of renders to prevent an infinite loop.
Wat betekent het? Je component zit in een oneindige loop: hij zet state, rendert opnieuw, zet weer state, enzovoort.
Fout:
<button onClick={setCount(count + 1)}>+1</button>
Goed:
<button onClick={() => setCount(count + 1)}>+1</button>
Zonder () => wordt setCount meteen uitgevoerd tijdens het renderen, in plaats van pas bij de klik.
Objects are not valid as a React child
Objects are not valid as a React child (found: object with keys {name, age}).
Wat betekent het? Je probeert een heel object op het scherm te zetten. React kan alleen tekst, getallen en JSX tonen.
Fout:
<p>{user}</p>
Goed:
<p>{user.name}</p>
Invalid DOM property `class`
Invalid DOM property `class`. Did you mean `className`?
Wat betekent het? In JSX heet class className (omdat class al een woord is in JavaScript).
Fout:
<div class="card">
<label for="email">
Goed:
<div className="card">
<label htmlFor="email">
Adjacent JSX elements
Adjacent JSX elements must be wrapped in an enclosing tag. Did you want a JSX fragment <>...</>?
Wat betekent het? Een component mag maar één buitenste element teruggeven.
Fout:
return (
<h1>Titel</h1>
<p>Tekst</p>
);
Goed:
return (
<>
<h1>Titel</h1>
<p>Tekst</p>
</>
);
Failed to resolve import
Failed to resolve import "./components/Navbar" from "src/App.jsx". Does the file exist?
Wat betekent het? Vite kan het bestand dat je importeert niet vinden.
- Pad fout?
./= dezelfde map,../= een map omhoog - Hoofdletters?
navbar.jsxenNavbar.jsxzijn verschillend - Staat het bestand echt in die map? Kijk in de verkenner van VS Code
Tip: typ in VS Code import Navbar from "./ en wacht even: VS Code laat zien welke bestanden er zijn.
does not provide an export named 'default'
Uncaught SyntaxError: The requested module '/src/components/Card.jsx' does not provide an export named 'default'
Wat betekent het? Je import en je export passen niet bij elkaar.
Fout:
// Card.jsx
export const Card = () => { ... };
// App.jsx
import Card from "./components/Card";
Goed:
// Card.jsx
const Card = () => { ... };
export default Card;
// App.jsx
import Card from "./components/Card";
Regel: export default → importeren zonder { }. Gewone export → importeren met { }.
uncontrolled input to be controlled
A component is changing an uncontrolled input to be controlled.
Wat betekent het? De value van je input was eerst undefined en daarna een tekst.
Fout:
const [naam, setNaam] = useState();
<input value={naam} onChange={(e) => setNaam(e.target.value)} />
Goed:
const [naam, setNaam] = useState(""); // begin met lege tekst
<input value={naam} onChange={(e) => setNaam(e.target.value)} />
Invalid hook call
Invalid hook call. Hooks can only be called inside of the body of a function component.
Wat betekent het? Je gebruikt een hook (useState, useEffect, …) op een plek waar het niet mag.
Fout:
const Teller = () => {
const handleClick = () => {
const [count, setCount] = useState(0); // in een functie!
};
};
Goed:
const Teller = () => {
const [count, setCount] = useState(0); // bovenaan je component
const handleClick = () => {
setCount(count + 1);
};
};
Hooks altijd bovenaan je component. Niet in een functie, if of loop.
useNavigate() zonder Router
useNavigate() may be used only in the context of a <Router> component.
Wat betekent het? Je gebruikt iets van React Router, maar je app zit niet in een <BrowserRouter>.
// main.jsx
import { BrowserRouter } from "react-router-dom";
createRoot(document.getElementById("root")).render(
<BrowserRouter>
<App />
</BrowserRouter>
);
Zie ook React Router.