In an uncontrolled form, we let the browser handle the form's state and rendering. We only react when the form is submitted using an onSubmit event handler.
Set up the HTML form as usual with the appropriate attributes (name, value, etc.).
In a controlled form, we wire up React to handle the form fields' states and rendering. This is typically used for cases where we need live access to the form values as the user enters data such as live form validation.
Controlled forms require a bit more setup than uncontrolled forms because state will be updated every time a form field changes (through keystrokes, clicks, etc.).
Create a state object with each form field's name as a property.
Add an onChange on each form field that will update the state with its new value.
Add a value prop to each form field and assign the corresponding state value.
Add an onSubmit event on the form and use the state object to get the form values.