Reactive form with real-time validation using computed signals
Fill out the form - watch validation happen in real-time!
const formData = createSignal({ email: '', password: '' });const emailError = createComputed(() => {
ย ย return validateEmail(formData.get().email);
});formData.set({ ...formData.get(), email: newEmail });
// emailError recalculates automatically! โจimport { createSignal, createComputed } from 'signalforge/core';
import { useSignalValue } from 'signalforge/react';
import { useState } from 'react';
function RegistrationForm() {
const [formData] = useState(() => createSignal({
email: '',
password: '',
confirmPassword: ''
}));
// Validation rules as computed signals
const [emailError] = useState(() => createComputed(() => {
const { email } = formData.get();
if (!email) return '';
if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
return 'Invalid email format';
}
return '';
}));
const [passwordError] = useState(() => createComputed(() => {
const { password } = formData.get();
if (!password) return '';
if (password.length < 8) {
return 'Password must be at least 8 characters';
}
if (!/[A-Z]/.test(password)) {
return 'Must contain uppercase letter';
}
if (!/[0-9]/.test(password)) {
return 'Must contain a number';
}
return '';
}));
const [isFormValid] = useState(() => createComputed(() => {
const data = formData.get();
return data.email && data.password &&
!emailErrorValue && !passwordErrorValue;
}));
const emailErrorValue = useSignalValue(emailError);
const isFormValidValue = useSignalValue(isFormValid);
return (
<form>
<input
value={formData.get().email}
onChange={(e) => formData.set({
...formData.get(),
email: e.target.value
})}
/>
{emailErrorValue && <p>{emailErrorValue}</p>}
<button disabled={!isFormValidValue}>
Submit
</button>
</form>
);
}
// โจ Benefits:
// โข Real-time validation as user types
// โข No manual validation calls needed
// โข Clean, declarative code
// โข Automatic dependency trackingKeep validation logic separate and reusable.
Give immediate feedback for better UX.
Don't overwhelm users with errors on empty fields.
Prevent form submission with invalid data.
Master form validation? Try these demos: