"If a worker wants to do his job well, he must first sharpen his tools." - Confucius, "The Analects of Confucius. Lu Linggong"
Front page > Programming > Detailed explanation of React's new Hooks: Getting Started Guide and Practical Techniques

Detailed explanation of React's new Hooks: Getting Started Guide and Practical Techniques

Posted on 2025-03-12
Browse:207

Understanding React New Hooks

React 19 introduces several powerful new hooks that revolutionize how we handle forms and manage optimistic updates in our applications. In this blog, we'll explore useFormStatus, useActionState, and useOptimistic - three hooks that make our React applications more responsive and user-friendly.

useFormStatus: Enhanced Form Handling

The useFormStatus hook provides real-time information about form submissions, making it easier to create responsive and accessible forms. Let's explore how this hook improves upon React 18's form handling capabilities.

Example 1: Basic Form Loading State

function SubmitButton() {
  const { pending } = useFormStatus();

  return (
    
  );
}

function SignupForm() {
  return (
    
{ await submitSignupData(formData); }}>
); }

In React 18, you'd need to manually manage loading states using useState. The new useFormStatus hook automatically handles this, reducing boilerplate code.

Example 2: Multiple Form States

function FormStatus() {
  const { pending, data, method } = useFormStatus();

  return (
    
{pending && Submitting via {method}...} {!pending && data && Last submission: {new Date().toLocaleString()}}
); } function ContactForm() { return (
{ await submitContactForm(formData); }}>
); }

Example 3: Form Validation Status

function ValidationStatus() {
  const { pending, validationErrors } = useFormStatus();

  return (
    
{validationErrors?.map((error, index) => (

{error}

))}
); } function RegistrationForm() { return (
{ const errors = validateRegistration(formData); if (errors.length) throw errors; await register(formData); }}>
); }

Example 4: Multi-Step Form Progress

function FormProgress() {
  const { pending, step, totalSteps } = useFormStatus();

  return (
    

Example 5: File Upload Progress

function UploadProgress() {
  const { pending, progress } = useFormStatus();

  return (
    
{pending && progress && (

useActionState: Managing Action Results

The useActionState hook provides a way to track the state of form actions and server mutations, making it easier to handle success and error states.

Example 1: Basic Action State

function SubmissionStatus() {
  const state = useActionState();

  return (
    
{state.status === 'success' &&

Submission successful!

} {state.status === 'error' &&

Error: {state.error.message}

}
); } function CommentForm() { return (
{ await submitComment(formData); }}>
); }

Example 2: Action History

function ActionHistory() {
  const state = useActionState();

  return (
    

Recent Actions

    {state.history.map((action, index) => (
  • {action.type} - {action.timestamp} {action.status === 'error' && ` (Failed: ${action.error.message})`}
  • ))}
); }

Example 3: Retry Mechanism

function RetryableAction() {
  const state = useActionState();

  return (
    
{state.status === 'error' && ( )}
); }

Example 4: Action Queue

function ActionQueue() {
  const state = useActionState();

  return (
    

Pending Actions

{state.queue.map((action, index) => (
{action.type} - Queued at {action.queuedAt}
))}
); }

Example 5: Action Statistics

function ActionStats() {
  const state = useActionState();

  return (
    

Action Statistics

Success Rate: {state.stats.successRate}%

Average Duration: {state.stats.avgDuration}ms

Total Actions: {state.stats.total}

); }

useOptimistic: Smooth UI Updates

The useOptimistic hook enables immediate UI updates while waiting for server responses, creating a more responsive user experience.

Example 1: Optimistic Todo List

function TodoList() {
  const [todos, setTodos] = useState([]);
  const [optimisticTodos, addOptimisticTodo] = useOptimistic(
    todos,
    (state, newTodo) => [...state, newTodo]
  );

  async function addTodo(formData) {
    const newTodo = {
      id: Date.now(),
      text: formData.get('todo'),
      completed: false
    };

    addOptimisticTodo(newTodo);
    await saveTodo(newTodo);
  }

  return (
    
    {optimisticTodos.map(todo => (
  • {todo.text}
  • ))}
); }

Example 2: Optimistic Like Button

function LikeButton({ postId, initialLikes }) {
  const [likes, setLikes] = useState(initialLikes);
  const [optimisticLikes, addOptimisticLike] = useOptimistic(
    likes,
    (state) => state   1
  );

  async function handleLike() {
    addOptimisticLike();
    await likePost(postId);
  }

  return (
    
  );
}

Example 3: Optimistic Comment Thread

function CommentThread({ postId }) {
  const [comments, setComments] = useState([]);
  const [optimisticComments, addOptimisticComment] = useOptimistic(
    comments,
    (state, newComment) => [...state, newComment]
  );

  async function submitComment(formData) {
    const comment = {
      id: Date.now(),
      text: formData.get('comment'),
      pending: true
    };

    addOptimisticComment(comment);
    await saveComment(postId, comment);
  }

  return (
    
{optimisticComments.map(comment => (

Example 4: Optimistic Shopping Cart

function ShoppingCart() {
  const [cart, setCart] = useState([]);
  const [optimisticCart, updateOptimisticCart] = useOptimistic(
    cart,
    (state, update) => {
      const { type, item } = update;
      switch (type) {
        case 'add':
          return [...state, item];
        case 'remove':
          return state.filter(i => i.id !== item.id);
        case 'update':
          return state.map(i => i.id === item.id ? item : i);
        default:
          return state;
      }
    }
  );

  async function updateCart(type, item) {
    updateOptimisticCart({ type, item });
    await saveCart({ type, item });
  }

  return (
    
{optimisticCart.map(item => (
{item.name} - ${item.price}
))}
); }

Example 5: Optimistic User Settings

function UserSettings() {
  const [settings, setSettings] = useState({});
  const [optimisticSettings, updateOptimisticSetting] = useOptimistic(
    settings,
    (state, update) => ({
      ...state,
      [update.key]: update.value
    })
  );

  async function updateSetting(key, value) {
    updateOptimisticSetting({ key, value });
    await saveSettings({ [key]: value });
  }

  return (
    
); }

Remember to check the official React documentation for the most up-to-date information and best practices when using these hooks in your applications.

Happy Coding!

Release Statement This article is reprinted at: https://dev.to/manojspace/understanding-react-19-new-hooks-4dkb?1 If there is any infringement, please contact [email protected] to delete it.
Latest tutorial More>

Disclaimer: All resources provided are partly from the Internet. If there is any infringement of your copyright or other rights and interests, please explain the detailed reasons and provide proof of copyright or rights and interests and then send it to the email: [email protected] We will handle it for you as soon as possible.

Copyright© 2022 湘ICP备2022001581号-3