Using useNavigation to Show Pending States in Remix
📖 Scenario: You are building a simple web page with Remix where users can submit a form. You want to show a message while the form submission is in progress, so users know something is happening.
🎯 Goal: Create a Remix component that uses useNavigation to detect when a form submission is pending and display a loading message during that time.
📋 What You'll Learn
Create a form with a submit button
Use the useNavigation hook from Remix
Show the text Submitting... only when the form is submitting
Hide the loading text when not submitting
💡 Why This Matters
🌍 Real World
Showing pending states during form submissions improves user experience by giving feedback that their action is being processed.
💼 Career
Understanding how to use Remix hooks like useNavigation is important for building responsive and user-friendly web applications.
Progress0 / 4 steps
1
Create a basic form in a Remix component
Create a Remix component called ContactForm that returns a form with a single submit button labeled Send.
Remix
Hint
Start by writing a function named ContactForm that returns a form with a submit button.
2
Import and set up useNavigation hook
Import useNavigation from @remix-run/react and call it inside the ContactForm component to get the navigation state. Store the result in a variable called navigation.
Remix
Hint
Remember to import useNavigation at the top and call it inside your component.
3
Add conditional rendering for pending state
Inside the ContactForm component, use the navigation.state property to check if it equals "submitting". If yes, render a <p> element with the text Submitting... above the form.
Remix
Hint
Use a conditional expression to show the paragraph only when navigation.state is "submitting".
4
Wrap the component with a fragment and finalize
Wrap the returned JSX in the ContactForm component inside a React fragment <></> to allow multiple elements. Ensure the loading text and form are siblings inside this fragment.
Remix
Hint
Use a React fragment to wrap multiple JSX elements returned from the component.
Practice
(1/5)
1. What does useNavigation in Remix Framework primarily help you detect?
easy
A. When a navigation or form submission is in progress
B. When the user clicks a button
C. When the page has fully loaded
D. When the server sends a response
Solution
Step 1: Understand the purpose of useNavigation
useNavigation is a hook that tells you about the current navigation state, such as loading or submitting.
Step 2: Identify what it detects
It specifically detects when navigation or form submission is happening, so you can show loading states.
Final Answer:
When a navigation or form submission is in progress -> Option A
Quick Check:
useNavigation detects navigation state = B [OK]
Hint: useNavigation tracks loading or submitting states only [OK]
Common Mistakes:
Confusing useNavigation with page load completion
Thinking it detects button clicks directly
Assuming it tracks server responses
2. Which of the following is the correct way to get the navigation state using useNavigation in a Remix component?
easy
A. const navigation = useNavigation(); const state = navigation.state;
B. const navigation = useNavigation(); const state = navigation.status;
C. const navigation = useNavigation; const state = navigation.state();
D. const navigation = useNavigation(); const state = navigation.navigationState;
Solution
Step 1: Recall the correct property name
The useNavigation hook returns an object with a state property that holds the current navigation state.
Step 2: Check syntax correctness
const navigation = useNavigation(); const state = navigation.state; correctly calls useNavigation() and accesses navigation.state. Other options use wrong property names or omit parentheses.
Final Answer:
const navigation = useNavigation(); const state = navigation.state; -> Option A
Quick Check:
Correct property is navigation.state = A [OK]
Hint: Remember: useNavigation() returns object with .state property [OK]
Common Mistakes:
Using navigation.status instead of navigation.state
Forgetting parentheses after useNavigation
Calling navigation.state as a function
3. Given this Remix component snippet, what will be rendered when a form submission is in progress?
Step 1: Check the condition for disabling the button
The button is disabled when navigation.state === 'submitting'.
Step 2: Check the button text during submission
When submitting, the button text changes to 'Submitting...'. So the button is disabled and shows 'Submitting...'.
Final Answer:
<button disabled>Submitting...</button> -> Option D
Quick Check:
Disabled + 'Submitting...' text = A [OK]
Hint: Button disables and text changes when state is 'submitting' [OK]
Common Mistakes:
Ignoring the disabled attribute
Showing 'Submit' text during submission
Confusing 'loading' with 'submitting' state
4. Identify the error in this Remix component using useNavigation:
import { useNavigation } from '@remix-run/react';
export default function LoadingIndicator() {
const navigation = useNavigation;
if (navigation.state === 'loading') {
return <div>Loading...</div>;
}
return <div>Ready</div>;
}
medium
A. Missing import for React
B. Forgot to call useNavigation as a function
C. Incorrect state value 'loading', should be 'submitting'
D. Return statements must be wrapped in parentheses
Solution
Step 1: Check how useNavigation is used
The code assigns const navigation = useNavigation; without parentheses, so navigation is a function reference, not the hook result.
Step 2: Understand the impact
Accessing navigation.state will cause an error because navigation is not the hook's returned object.
Final Answer:
Forgot to call useNavigation as a function -> Option B
Quick Check:
useNavigation() must be called with () = C [OK]
Hint: Always call useNavigation() with parentheses [OK]
Common Mistakes:
Using useNavigation without ()
Confusing 'loading' and 'submitting' states
Assuming React import is mandatory for hooks
5. You want to disable a submit button and show a spinner only when a form submission or navigation is pending using useNavigation. Which code snippet correctly implements this behavior?
A)
A. Disables only on 'loading' state, missing 'submitting'
B. Disables and shows submitting only during form submission
C. Disables and shows loading for any non-idle state
D. Uses invalid 'pending' state which does not exist
Solution
Step 1: Understand navigation.state values
Valid states are 'idle', 'loading', and 'submitting'. 'pending' is not valid.
Step 2: Check which snippet covers all pending states
Disables and shows loading for any non-idle state disables the button and shows loading text whenever state is not 'idle', covering both 'loading' and 'submitting'.
Step 3: Evaluate other options
A only disables on 'loading' (misses 'submitting'), B disables and shows loading for any non-idle state, C only on 'submitting', D uses invalid state.
Final Answer:
Disables and shows loading for any non-idle state -> Option C
Quick Check:
Use state !== 'idle' for all pending states = B [OK]
Hint: Check for state !== 'idle' to cover all pending states [OK]
Common Mistakes:
Using invalid state names like 'pending'
Checking only 'loading' or only 'submitting'
Not showing feedback for all navigation states
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.