Basis Form

In React bouw je forms met controlled components. Dit betekent dat React de waarde van input velden controleert via state.

import { useState } from 'react';

const BasicForm = () => {
  const [name, setName] = useState('');

  const handleSubmit = (e) => {
    e.preventDefault();
    alert(`Naam: ${name}`);
  };

  return (
    <form onSubmit={handleSubmit}>
      <input 
        type="text"
        value={name}
        onChange={(e) => setName(e.target.value)}
        placeholder="Typ je naam"
      />
      <button type="submit">Verstuur</button>
    </form>
  );
};

export default BasicForm;

Belangrijk: Gebruik altijd e.preventDefault() bij onSubmit om te voorkomen dat de pagina refresht!

Controlled Component:

  • value={name} - React controleert de waarde
  • onChange - Update state bij elke wijziging
  • State is de "single source of truth"

Verschillende Input Types

Text Input

const [text, setText] = useState('');

<input 
  type="text"
  value={text}
  onChange={(e) => setText(e.target.value)}
/>

Email Input

const [email, setEmail] = useState('');

<input 
  type="email"
  value={email}
  onChange={(e) => setEmail(e.target.value)}
/>

Checkbox

const [agreed, setAgreed] = useState(false);

<input 
  type="checkbox"
  checked={agreed}
  onChange={(e) => setAgreed(e.target.checked)}
/>

Let op: Bij checkbox gebruik je checked in plaats van value en e.target.checked in plaats van e.target.value!

Select Dropdown

const [country, setCountry] = useState('');

<select value={country} onChange={(e) => setCountry(e.target.value)}>
  <option value="">Kies een land</option>
  <option value="nl">Nederland</option>
  <option value="be">België</option>
  <option value="de">Duitsland</option>
</select>

Textarea

const [message, setMessage] = useState('');

<textarea 
  value={message}
  onChange={(e) => setMessage(e.target.value)}
  rows="5"
/>

Form met Object State

Voor forms met meerdere velden is het handig om een object te gebruiken:

import { useState } from 'react';

const UserForm = () => {
  const [formData, setFormData] = useState({
    name: '',
    email: '',
    age: ''
  });

  const handleChange = (e) => {
    setFormData({
      ...formData,
      [e.target.name]: e.target.value
    });
  };

  const handleSubmit = (e) => {
    e.preventDefault();
    console.log(formData);
  };

  return (
    <form onSubmit={handleSubmit}>
      <input 
        type="text"
        name="name"
        value={formData.name}
        onChange={handleChange}
        placeholder="Naam"
      />
      
      <input 
        type="email"
        name="email"
        value={formData.email}
        onChange={handleChange}
        placeholder="Email"
      />
      
      <input 
        type="number"
        name="age"
        value={formData.age}
        onChange={handleChange}
        placeholder="Leeftijd"
      />
      
      <button type="submit">Verstuur</button>
    </form>
  );
};

Voordeel: Eén handleChange functie voor alle inputs! Gebruik name attribute om te weten welk veld verandert.

Form Validatie

Controleer of de input correct is voordat je het verstuurt:

import { useState } from 'react';

const LoginForm = () => {
  const [email, setEmail] = useState('');
  const [password, setPassword] = useState('');
  const [error, setError] = useState('');

  const handleSubmit = (e) => {
    e.preventDefault();
    setError(''); // Reset error

    // Validatie
    if (!email) {
      setError('Email is verplicht');
      return;
    }
    
    if (!password || password.length < 6) {
      setError('Wachtwoord moet minimaal 6 karakters zijn');
      return;
    }

    // Submit form
    console.log('Form is valid!', email, password);
  };

  return (
    <form onSubmit={handleSubmit}>
      {error && <p style={{ color: 'red' }}>{error}</p>}
      
      <input 
        type="email"
        value={email}
        onChange={(e) => setEmail(e.target.value)}
        placeholder="Email"
      />
      
      <input 
        type="password"
        value={password}
        onChange={(e) => setPassword(e.target.value)}
        placeholder="Wachtwoord"
      />
      
      <button type="submit">Login</button>
    </form>
  );
};

Praktische Voorbeelden

Contact Form

const ContactForm = () => {
  const [form, setForm] = useState({
    name: '',
    email: '',
    message: ''
  });

  const handleSubmit = (e) => {
    e.preventDefault();
    // Send to API
    console.log('Sending:', form);
    // Reset form
    setForm({ name: '', email: '', message: '' });
  };

  const handleChange = (e) => {
    setForm({
      ...form,
      [e.target.name]: e.target.value
    });
  };

  return (
    <form onSubmit={handleSubmit}>
      <input 
        name="name"
        value={form.name}
        onChange={handleChange}
        placeholder="Naam"
        required
      />
      
      <input 
        name="email"
        type="email"
        value={form.email}
        onChange={handleChange}
        placeholder="Email"
        required
      />
      
      <textarea 
        name="message"
        value={form.message}
        onChange={handleChange}
        placeholder="Bericht"
        required
      />
      
      <button type="submit">Verstuur</button>
    </form>
  );
};

Registration Form met Checkbox

const RegisterForm = () => {
  const [form, setForm] = useState({
    email: '',
    password: '',
    agree: false
  });

  const handleSubmit = (e) => {
    e.preventDefault();
    if (!form.agree) {
      alert('Je moet akkoord gaan met de voorwaarden');
      return;
    }
    console.log('Registering:', form);
  };

  return (
    <form onSubmit={handleSubmit}>
      <input 
        type="email"
        value={form.email}
        onChange={(e) => setForm({...form, email: e.target.value})}
      />
      
      <input 
        type="password"
        value={form.password}
        onChange={(e) => setForm({...form, password: e.target.value})}
      />
      
      <label>
        <input 
          type="checkbox"
          checked={form.agree}
          onChange={(e) => setForm({...form, agree: e.target.checked})}
        />
        Ik ga akkoord met de voorwaarden
      </label>
      
      <button type="submit">Registreer</button>
    </form>
  );
};