React 19 引入了幾個強大的新鉤子,徹底改變了我們在應用程式中處理表單和管理樂觀更新的方式。在本部落格中,我們將探討 useFormStatus、useActionState 和 useOptimistic - 三個使我們的 React 應用程式響應更快且用戶友好的鉤子。
useFormStatus:增強的表單處理
useFormStatus 掛鉤提供有關表單提交的即時信息,使創建響應式且可訪問的表單變得更加容易。讓我們探討一下這個鉤子如何改進 React 18 的表單處理能力。
範例1:基本表單載入狀態
function SubmitButton() { const { pending } = useFormStatus(); return ( <button disabled> {pending ? 'Submitting...' : 'Submit'} </button> ); } function SignupForm() { return (); }
在 React 18 中,您需要使用 useState 手動管理載入狀態。新的 useFormStatus 掛鉤會自動處理此問題,從而減少樣板程式碼。
範例 2:多種表單狀態
function FormStatus() { const { pending, data, method } = useFormStatus(); return ( <div role="status"> {pending && <span>Submitting via {method}...</span>} {!pending && data && <span>Last submission: {new Date().toLocaleString()}</span>} </div> ); } function ContactForm() { return (); }
範例 3:表單驗證狀態
function ValidationStatus() { const { pending, validationErrors } = useFormStatus(); return ( <div role="alert"> {validationErrors?.map((error, index) => ( <p key="{index}" classname="error">{error}</p> ))} </div> ); } function RegistrationForm() { return (); }
範例 4:多步驟表單進度
function FormProgress() { const { pending, step, totalSteps } = useFormStatus(); return ( <div classname="progress-bar"> <div classname="progress"> <h3> Example 5: File Upload Progress </h3> <pre class="brush:php;toolbar:false">function UploadProgress() { const { pending, progress } = useFormStatus(); return ( <div> {pending && progress && ( <div classname="upload-progress"> <div classname="progress-bar"> <h2> useActionState: Managing Action Results </h2> <p>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.</p> <h3> Example 1: Basic Action State </h3> <pre class="brush:php;toolbar:false">function SubmissionStatus() { const state = useActionState(); return ( <div> {state.status === 'success' && <p>Submission successful!</p>} {state.status === 'error' && <p>Error: {state.error.message}</p>} </div> ); } function CommentForm() { return (); }
範例 2:動作歷史記錄
function ActionHistory() { const state = useActionState(); return ( <div> <h3 id="Recent-Actions">Recent Actions</h3> <ul> {state.history.map((action, index) => ( <li key="{index}"> {action.type} - {action.timestamp} {action.status === 'error' && ` (Failed: ${action.error.message})`} </li> ))} </ul> </div> ); }
範例3:重試機制
function RetryableAction() { const state = useActionState(); return ( <div> {state.status === 'error' && ( <button onclick="{()"> state.retry()} disabled={state.retrying} > {state.retrying ? 'Retrying...' : 'Retry'} </button> )} </div> ); }
範例 4:操作佇列
function ActionQueue() { const state = useActionState(); return ( <div> <h3 id="Pending-Actions">Pending Actions</h3> {state.queue.map((action, index) => ( <div key="{index}"> {action.type} - Queued at {action.queuedAt} <button onclick="{()"> action.cancel()}>Cancel</button> </div> ))} </div> ); }
範例 5:動作統計
function ActionStats() { const state = useActionState(); return ( <div> <h3 id="Action-Statistics">Action Statistics</h3> <p>Success Rate: {state.stats.successRate}%</p> <p>Average Duration: {state.stats.avgDuration}ms</p> <p>Total Actions: {state.stats.total}</p> </div> ); }
useOptimistic:流暢的 UI 更新
useOptimistic 掛鉤可以在等待伺服器回應時立即更新 UI,從而創建響應更快的使用者體驗。
範例 1:樂觀的待辦事項列表
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 ( <div> <form action="%7BaddTodo%7D"> <input name="todo"> <button type="submit">Add Todo</button> </form> <ul> {optimisticTodos.map(todo => ( <li key="{todo.id}">{todo.text}</li> ))} </ul> </div> ); }
範例 2:樂觀點讚按鈕
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 ( <button onclick="{handleLike}"> {optimisticLikes} Likes </button> ); }
範例 3:樂觀評論線程
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 ( <div> <form action="%7BsubmitComment%7D"> <textarea name="comment"></textarea> <button type="submit">Comment</button> </form> {optimisticComments.map(comment => ( <div key="{comment.id}"> <h3> Example 4: Optimistic Shopping Cart </h3> <pre class="brush:php;toolbar:false">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 ( <div> {optimisticCart.map(item => ( <div key="{item.id}"> {item.name} - ${item.price} <button onclick="{()"> updateCart('remove', item)}>Remove</button> </div> ))} </div> ); }
範例 5:樂觀用戶設置
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 ( <div> <div> <label> Theme: <select value="{optimisticSettings.theme}" onchange="{e"> updateSetting('theme', e.target.value)} > <option value="light">Light</option> <option value="dark">Dark</option> </select> </label> </div> <div> <label> Notifications: <input type="checkbox" checked onchange="{e"> updateSetting('notifications', e.target.checked)} /> </label> </div> </div> ); }
在應用程式中使用這些鉤子時,請記住查看官方 React 文件以獲取最新資訊和最佳實踐。
編碼快樂!
以上是了解 React 新 Hooks的詳細內容。更多資訊請關注PHP中文網其他相關文章!

JavaScript在網站、移動應用、桌面應用和服務器端編程中均有廣泛應用。 1)在網站開發中,JavaScript與HTML、CSS一起操作DOM,實現動態效果,並支持如jQuery、React等框架。 2)通過ReactNative和Ionic,JavaScript用於開發跨平台移動應用。 3)Electron框架使JavaScript能構建桌面應用。 4)Node.js讓JavaScript在服務器端運行,支持高並發請求。

Python更適合數據科學和自動化,JavaScript更適合前端和全棧開發。 1.Python在數據科學和機器學習中表現出色,使用NumPy、Pandas等庫進行數據處理和建模。 2.Python在自動化和腳本編寫方面簡潔高效。 3.JavaScript在前端開發中不可或缺,用於構建動態網頁和單頁面應用。 4.JavaScript通過Node.js在後端開發中發揮作用,支持全棧開發。

C和C 在JavaScript引擎中扮演了至关重要的角色,主要用于实现解释器和JIT编译器。1)C 用于解析JavaScript源码并生成抽象语法树。2)C 负责生成和执行字节码。3)C 实现JIT编译器,在运行时优化和编译热点代码,显著提高JavaScript的执行效率。

JavaScript在現實世界中的應用包括前端和後端開發。 1)通過構建TODO列表應用展示前端應用,涉及DOM操作和事件處理。 2)通過Node.js和Express構建RESTfulAPI展示後端應用。

JavaScript在Web開發中的主要用途包括客戶端交互、表單驗證和異步通信。 1)通過DOM操作實現動態內容更新和用戶交互;2)在用戶提交數據前進行客戶端驗證,提高用戶體驗;3)通過AJAX技術實現與服務器的無刷新通信。

理解JavaScript引擎內部工作原理對開發者重要,因為它能幫助編寫更高效的代碼並理解性能瓶頸和優化策略。 1)引擎的工作流程包括解析、編譯和執行三個階段;2)執行過程中,引擎會進行動態優化,如內聯緩存和隱藏類;3)最佳實踐包括避免全局變量、優化循環、使用const和let,以及避免過度使用閉包。

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

Python和JavaScript在社區、庫和資源方面的對比各有優劣。 1)Python社區友好,適合初學者,但前端開發資源不如JavaScript豐富。 2)Python在數據科學和機器學習庫方面強大,JavaScript則在前端開發庫和框架上更勝一籌。 3)兩者的學習資源都豐富,但Python適合從官方文檔開始,JavaScript則以MDNWebDocs為佳。選擇應基於項目需求和個人興趣。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

Atom編輯器mac版下載
最受歡迎的的開源編輯器