"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Explication détaillée des nouveaux crochets de React: Guide de démarrage et techniques pratiques

Explication détaillée des nouveaux crochets de React: Guide de démarrage et techniques pratiques

Publié le 2025-03-12
Parcourir:333

Understanding React New Hooks

React 19 présente plusieurs nouveaux crochets puissants qui révolutionnons la façon dont nous gérons les formulaires et gérons les mises à jour optimistes dans nos applications. Dans ce blog, nous explorerons USEFormStatus, UseActionState et UseOPtimistic - trois crochets qui rendent nos applications React plus réactives et conviviales.

useFormStatus: gestion de formulaire améliorée

Le crochet UseFormStatus fournit des informations en temps réel sur les soumissions de formulaires, ce qui facilite la création de formulaires réactifs et accessibles. Explorons comment ce crochet s'améliore sur les capacités de gestion de la forme de React 18.

Exemple 1: état de chargement de formulaire de base

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

  return (
    
  );
}

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

Dans React 18, vous devrez gérer manuellement les états de chargement à l'aide d'Usestate. Le nouveau crochet UseFormStatus le gère automatiquement, réduisant le code de la bail.

Exemple 2: états de formulaires multiples

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); }}>
); }

Exemple 3: État de validation du formulaire

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); }}>
); }

Exemple 4: Progrès en plusieurs étapes

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); }}>
); }

Exemple 2: Historique de l'action

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

  return (
    

Recent Actions

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

Exemple 3: Mécanisme de réessayer

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

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

Exemple 4: file d'attente d'action

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

  return (
    

Pending Actions

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

Exemple 5: Statistiques d'action

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: mises à jour d'interface utilisateur lisses

Le crochet useoptimiste permet des mises à jour d'interface utilisateur immédiates en attendant les réponses du serveur, créant une expérience utilisateur plus réactive.

Exemple 1: Liste de TODO optimiste

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}
  • ))}
); }

Exemple 2: Bouton optimiste comme

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 (
    
  );
}

Exemple 3: Fil de commentaire optimiste

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}
))}
); }

Exemple 5: Paramètres utilisateur optimistes

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 (
    
); }

N'oubliez pas de vérifier la documentation officielle de réaction pour les informations les plus à jour et les meilleures pratiques lorsque vous utilisez ces crochets dans vos applications.

codage heureux!

Déclaration de sortie Cet article est réimprimé à: https://dev.to/manojspace/udgerstanding-react-19-new-hooks-4dkb?1 S'il y a une contrefaçon, veuillez contacter [email protected] pour le supprimer.
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3