1
ReactIntermediate#fundamentals#performance
A controlled input keeps its value in React state and updates through onChange, giving you validation and single-source-of-truth. An uncontrolled input keeps the value in the DOM and is read via a ref.
// controlled
<input value={name} onChange={e => setName(e.target.value)} />
// uncontrolled
<input ref={inputRef} defaultValue="Anu" />