Первый вариант будет лучше если у вас форма и компонентов много. Можно обрабатывать все одним хандлером:
const handler = (e) => {
const { target } = e;
const value = target.type === 'checkbox' ? target.checked : target.value;
const { name } = target;
setForm( f => ({ ...f, [name]: value }));
};
Второй, если checkbox один и приложение должно как-то реагировать на его изменение. Но хандлер для лучшей читаемости, лучше вынести в переменную. Если это built-in компонент вроде input:
const handler = () => {
setX(!x);
};
И если это кастомный компонент, то необходимо использовать useCallback, чтобы предотвратить лишние перерисовки:
const handler = useCallback(() => {
setX(!x);
}, []);
Ну и неконтролируемые компоненты, упомянутые
Алексей Николаев, в ряде кейсов могут быть очень удобны.