在畫面驗證姓名與 Email
畫面依序顯示「請輸入姓名」、「Email 格式不正確」與「驗證通過;尚未建立 payload」,預覽區仍未建立 payload
CHAPTER 23 · 180 MINUTES
表單像寄件櫃台:先驗收內容、整理 payload、送出一次,最後把成功或失敗清楚交代。
LEARNING GOALS
畫面依序顯示「請輸入姓名」、「Email 格式不正確」與「驗證通過;尚未建立 payload」,預覽區仍未建立 payload
預覽區顯示 name、email、message,狀態為「payload 已建立;尚未送出」
送出期間停用按鈕,成功或失敗後都恢復可操作。
輸入:第 22 章產物:完成可前後翻頁的產品列表
本章輸出:完成可驗證、提交並顯示結果的聯絡表單
產物類型:mainline;後續用途:第 27 章
PROBLEM & ANALOGY
第 22 章都在讀取資料;本章第一次接住使用者輸入。validation 像櫃台驗件、payload 像寄件單、POST 像交寄、loading 像處理中號碼牌。
本章要解決:錯誤內容不能送出,連點不能製造重複請求,失敗後介面也不能鎖死。
合回共同作品:聯絡表單會成為作品集能被別人實際操作的入口。
SCOPE
validation、payload、POST、loading/success/error 與 finally 收尾。
HTTP method、request body 與 content type 是送出契約的一部分。
檔案上傳、OAuth、正式防垃圾機制與敏感個資收集。
CORE IDEAS
preventDefault(),讀取欄位後執行 validate;不合法就停止。createPayload() 只建立允許送出的固定欄位,預覽後才 POST。DEBUGGING
課堂刻意錯誤:連點造成重複送出,或只在 success 恢復按鈕,讓 error 後介面永久鎖死。
先查:確認 preventDefault、validate 與請求呼叫順序。
先查:對照 payload 預覽與允許欄位,不送整個表單物件。
先查:確認 finally 在 success 與 error 後恢復提交狀態。
PRACTICE CONTRACT
檔案:script.js
位置:validate()
結果:畫面顯示姓名、Email 驗證結果,通過時仍明確標示尚未建立 payload
檔案:script.js
位置:createPayload()
結果:預覽區顯示 name、email、message,狀態為「payload 已建立;尚未送出」
檔案:script.js
位置:mockSubmit()、handleSubmit()
結果:成功與失敗都可重現,送出期間按鈕停用且完成後恢復
EVIDENCE
送出先由 ______ 驗證;payload 只有 ______;失敗後由 ______ 恢復 ______。
使用 mockSubmit 時要清楚寫「模擬」;不要把 mock 寫入說成正式後端資料。
展示空白、錯誤 Email、成功與模擬失敗四條路線;附一次 payload 預覽,以及送出期間按鈕停用的畫面。
下一章:從一次 POST 改成持續訂閱即時資料。