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.
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.
function SubmitButton() { const { pending } = useFormStatus(); return ( ); } function SignupForm() { return (); }
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.
function FormStatus() { const { pending, data, method } = useFormStatus(); return (); }{pending && Submitting via {method}...} {!pending && data && Last submission: {new Date().toLocaleString()}}); } function ContactForm() { return (
function ValidationStatus() { const { pending, validationErrors } = useFormStatus(); return (); }{validationErrors?.map((error, index) => (); } function RegistrationForm() { return ({error}
))}
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' &&); } function CommentForm() { return (Submission successful!
} {state.status === 'error' &&Error: {state.error.message}
}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!
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