--- title: Reacting to Input with State --- React uses a declarative way to manipulate the UI. Instead of manipulating individual pieces of the UI directly, you describe the different states that your component can be in, and switch between them in response to the user input. This is similar to how designers think about the UI. * How declarative UI programming differs from imperative UI programming * How to enumerate the different visual states your component can be in * How to trigger the changes between the different visual states from code ## How declarative UI compares to imperative {/*how-declarative-ui-compares-to-imperative*/} When you design UI interactions, you probably think about how the UI *changes* in response to user actions. Consider a form that lets the user submit an answer: * When you type something into a form, the "Submit" button **becomes enabled.** * When you press "Submit", both form and the button **become disabled,** and a spinner **appears.** * If the network request succeeds, the form **gets hidden,** and the "Thank you" message **appears.** * If the network request fails, an error message **appears,** and the form **becomes enabled** again. In **imperative programming,** the above corresponds directly to how you implement interaction. You have to write the exact instructions to manipulate the UI depending on what just happened. Here's another way to think about this: imagine riding next to someone in a car and telling them turn by turn where to go. They don't know where you want to go, they just follow your commands. (And if you get the directions wrong, you end up in the wrong place!) It's called *imperative* because you have to "command" each element, from the spinner to the button, telling the computer *how* to update the UI. In this example of imperative UI programming, the form is built *without* React. It uses the built-in browser [DOM](https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model): ```js index.js active async function handleFormSubmit(e) { e.preventDefault(); disable(textarea); disable(button); show(loadingMessage); hide(errorMessage); try { await submitForm(textarea.value); show(successMessage); hide(form); } catch (err) { show(errorMessage); errorMessage.textContent = err.message; } finally { hide(loadingMessage); enable(textarea); enable(button); } } function handleTextareaChange() { if (textarea.value.length === 0) { disable(button); } else { enable(button); } } function hide(el) { el.style.display = 'none'; } function show(el) { el.style.display = ''; } function enable(el) { el.disabled = false; } function disable(el) { el.disabled = true; } function submitForm(answer) { // Pretend it's hitting the network. return new Promise((resolve, reject) => { setTimeout(() => { if (answer.toLowerCase() == 'istanbul') { resolve(); } else { reject(new Error('Good guess but a wrong answer. Try again!')); } }, 1500); }); } let form = document.getElementById('form'); let textarea = document.getElementById('textarea'); let button = document.getElementById('button'); let loadingMessage = document.getElementById('loading'); let errorMessage = document.getElementById('error'); let successMessage = document.getElementById('success'); form.onsubmit = handleFormSubmit; textarea.oninput = handleTextareaChange; ``` ```js sandbox.config.json hidden { "hardReloadOnChange": true } ``` ```html public/index.html

City quiz

What city is located on two continents?


That's right!

```
Manipulating the UI imperatively works well enough for isolated examples, but it gets exponentially more difficult to manage in more complex systems. Imagine updating a page full of different forms like this one. Adding a new UI element or a new interaction would require carefully checking all existing code to make sure you haven't introduced a bug (for example, forgetting to show or hide something). React was built to solve this problem. In React, you don't directly manipulate the UI--meaning you don't enable, disable, show, or hide components directly. Instead, you **declare what you want to show,** and React figures out how to update the UI. Think of getting into a taxi and telling the driver where you want to go instead of telling them exactly where to turn. It's the driver's job to get you there, and they might even know some shortcuts you haven't considered! ## Thinking about UI declaratively {/*thinking-about-ui-declaratively*/} You've seen how to implement a form imperatively above. To better understand how to think in React, you'll walk through reimplementing this UI in React below: 1. **Identify** your component's different visual states 2. **Determine** what triggers those state changes 3. **Represent** the state in memory using `useState` 4. **Remove** any non-essential state variables 5. **Connect** the event handlers to set the state ### Step 1: Identify your component's different visual states {/*step-1-identify-your-components-different-visual-states*/} In computer science, you may hear about a ["state machine"](https://en.wikipedia.org/wiki/Finite-state_machine) being in one of several “states”. If you work with a designer, you may have seen mockups for different "visual states". React stands at the intersection of design and computer science, so both of these ideas are sources of inspiration. First, you need to visualize all the different "states" of the UI the user might see: * **Empty**: Form has a disabled "Submit" button. * **Typing**: Form has an enabled "Submit" button. * **Submitting**: Form is completely disabled. Spinner is shown. * **Success**: "Thank you" message is shown instead of a form. * **Error**: Same as Typing state, but with an extra error message. Just like a designer, you'll want to "mock up" or create "mocks" for the different states before you add logic. For example, here is a mock for just the visual part of the form. This mock is controlled by a prop called `status` with a default value of `'empty'`: ```js export default function Form({ status = 'empty' }) { if (status === 'success') { return

That's right!

} return ( <>

City quiz

In which city is there a billboard that turns air into drinkable water?