初學者必讀:網頁中的「狀態」是什麼?
更新日期: 2025 年 3 月 27 日
如果你是剛開始學習前端或網頁開發的新手,一定聽過「狀態(state)」這個詞。
但它到底是什麼?為什麼開發者常說「這是狀態的問題」?
本篇文章將從一個非常直觀的角度切入——畫面上的資料為什麼會變?
帶你一步步理解網頁中的「狀態」,並透過日常生活中的例子,幫助你建立起對這個抽象概念的直覺認知。
什麼是「狀態」?
在前端開發中,「狀態(state)」這個詞常常出現,但它其實沒有你想像中那麼難懂。
你可以先這樣想:
👉 狀態,就是畫面上資料的「當下狀況」。
只要是會影響畫面顯示的資料,它就是一種「狀態」。
更正式一點的說法是:
狀態是「一組影響使用者介面(UI)外觀或行為的資料」。
舉個簡單的例子:
假設你打開一個網站,畫面上有一個「登入」按鈕。
當你登入之後,這個按鈕變成了「登出」或「歡迎,XXX」。這就是因為「登入狀態」這筆資料改變了,導致畫面也跟著更新。
也就是說,只要畫面有東西會變,那背後一定有某些資料也跟著變了,這些資料就是所謂的「狀態」。
你可以把「狀態」想像成畫面背後的一張表格,裡面記錄了目前畫面該怎麼呈現,例如:
狀態名稱 | 當前值 |
---|---|
使用者是否登入 | true |
購物車商品數量 | 2 |
表單錯誤訊息 | “請填寫姓名” |
這些值一改,畫面就會立刻跟著更新,像是出現提示訊息、按鈕變色、清空輸入框等等。
flowchart TD subgraph 狀態資料["狀態資料 State"] A1["使用者登入: false"] A2["使用者登入: true"] C1["購物車商品: 0"] C2["購物車商品: 2"] E1["表單驗證: 失敗"] E2["表單驗證: 成功"] end subgraph UI畫面["UI畫面 Interface"] B1["登入按鈕"] B2["顯示「歡迎, 使用者」"] D1["顯示「購物車為空」"] D2["顯示「購物車(2)」"] F1["顯示錯誤訊息"] F2["顯示「送出成功」"] end A1 --> B1 A2 --> B2 C1 --> D1 C2 --> D2 E1 --> F1 E2 --> F2 style A1 fill:#e6f7ff,stroke:#1890ff,stroke-width:1px style A2 fill:#e6f7ff,stroke:#1890ff,stroke-width:1px style C1 fill:#e6f7ff,stroke:#1890ff,stroke-width:1px style C2 fill:#e6f7ff,stroke:#1890ff,stroke-width:1px style E1 fill:#e6f7ff,stroke:#1890ff,stroke-width:1px style E2 fill:#e6f7ff,stroke:#1890ff,stroke-width:1px style B1 fill:#f6ffed,stroke:#52c41a,stroke-width:1px style B2 fill:#f6ffed,stroke:#52c41a,stroke-width:1px style D1 fill:#f6ffed,stroke:#52c41a,stroke-width:1px style D2 fill:#f6ffed,stroke:#52c41a,stroke-width:1px style F1 fill:#f6ffed,stroke:#52c41a,stroke-width:1px style F2 fill:#f6ffed,stroke:#52c41a,stroke-width:1px
為什麼要管「狀態」?
你可能會想:「那我就讓畫面改一改就好了啊,幹嘛要特別知道什麼是狀態?」
這裡有一個關鍵的觀念:
👉 使用者介面不是死的,它是活的。
現代的網站和應用程式(App)大多都有豐富的互動功能,幾乎不可能是完全靜態的。
也就是說,畫面會根據使用者的操作而改變,這些變化都依賴狀態的變化。
來看幾個實際的例子:
🔒 使用者登入畫面:
- 初次進來顯示「登入」按鈕
- 使用者輸入帳密後按下登入 → 畫面變成「歡迎,小明」,還多出個「登出」按鈕
- 發生的事:使用者的「登入狀態」從 false 變成 true,畫面根據狀態更新
🛒 購物車:
- 一開始購物車是空的 → 畫面顯示「目前沒有商品」
- 加入一項商品後 → 畫面改為「已加入:口紅」並顯示總金額
- 發生的事:購物車的商品列表(狀態)發生變化,畫面因此改變
📄 表單送出:
- 使用者填資料 → 按下送出
- 若填寫不完整 → 畫面出現錯誤訊息:「請填寫所有欄位」
- 若填寫正確 → 畫面變成「感謝您,資料已送出成功」
- 發生的事:驗證結果的狀態不同,導致顯示內容不同
這些例子都顯示了一個重點:
UI(畫面)之所以會變,是因為它「聽著」某些資料的變化,而那些資料就是「狀態」。
用生活例子理解「狀態」
光講定義可能還是太抽象,現在我們用幾個生活中常見的網頁操作來舉例,讓你更具體地感受到「原來這就是狀態!」
購物車:商品列表、數量與總金額都是狀態
想像你正在逛某個購物網站,看到一支不錯的筆電,點了「加入購物車」:
- 畫面右上角的購物車 icon 從
0
變成1
- 畫面上跳出提示:「已加入筆電」
- 點進購物車頁面,你會看到這支筆電的名稱、價格、數量,以及目前的總金額
這整個過程,背後其實是有一組狀態在默默幫你記錄事情:
狀態名稱 | 說明 |
---|---|
cartItems | 一個陣列,紀錄目前購物車中有哪些商品 |
totalPrice | 根據商品加總的金額 |
cartCount | 購物車 icon 上的商品數量 |
每當你加入或移除商品,這些狀態都會變動,而畫面就是根據這些狀態來「重新渲染」。
也就是說:狀態變了,UI 就跟著變。
表單輸入:每個欄位的內容都是狀態
再來看看一個非常常見的例子——註冊表單。
假設你正在填寫一個註冊頁面,有以下欄位:
- 姓名
- 信箱
- 密碼
- 同意服務條款的勾選框
- 一個「送出」按鈕
在這個表單中,每一個輸入的值、是否出現錯誤訊息、送出後的成功提示,全部都是狀態。
舉例:
狀態名稱 | 範例值 | 說明 |
---|---|---|
name | “小明” | 使用者輸入的名字 |
“” | 使用者尚未輸入信箱 | |
password | “123456” | 使用者輸入的密碼 |
isAgreed | true | 是否勾選「我同意」 |
errorMessage | “請填寫完整資料” | 表單驗證失敗時顯示的訊息 |
isSubmitted | false → true | 表單是否已成功送出 |
根據這些狀態,UI 會顯示或隱藏錯誤訊息、讓送出按鈕變成不可點擊、或顯示「註冊成功」畫面。
這一切的控制核心,就是「狀態」。
登入系統:登入與否決定畫面內容
再來是一個幾乎每個網站都會有的功能——登入系統。
你打開一個網站時,畫面可能會這樣變:
- 未登入時:顯示登入表單、註冊按鈕、訪客導覽內容
- 登入成功後:顯示「歡迎,小明!」、「登出」按鈕,以及個人化的資訊或服務
這背後最主要的狀態就是:
狀態名稱 | 值 | 功能 |
---|---|---|
isLoggedIn | true / false | 決定使用者是否已登入 |
userInfo | { name: “小明”, email: “[email protected]” } | 顯示使用者的個人資訊 |
登入成功 → isLoggedIn
變成 true → 畫面整個切換成會員狀態,這就是「狀態驅動介面」的典型例子。
什麼時候會用到「狀態」?
當你開始寫網頁時,幾乎每一個互動功能都會牽涉到「狀態」的變化與管理。下面是一些你未來一定會遇到的場景,每一個都會需要你管理狀態:
🔄 切換分頁/標籤頁(Tabs)
- 使用者點選不同的頁籤 → 狀態
activeTab = "商品資訊"
→ UI 顯示對應的內容
🔲 顯示或隱藏 Modal、彈出視窗
- 點按「查看詳情」 →
isModalOpen = true
→ 顯示詳情視窗 - 按下關閉按鈕 →
isModalOpen = false
→ 隱藏視窗
📝 表單資料與錯誤提示
- 使用者每輸入一個字 → 狀態更新
- 驗證失敗 → 狀態
error = "請填寫正確信箱"
→ 顯示錯誤訊息
📑 分頁、排序、搜尋
- 使用者搜尋「iPhone」 →
searchKeyword = "iPhone"
- 使用者點選「價格由低到高」 →
sort = "price-asc"
- 畫面上的商品清單會根據這些狀態重新篩選與排序
🔐 使用者登入狀態
isLoggedIn = true
→ 顯示個人資料、會員功能isLoggedIn = false
→ 顯示登入/註冊選項
⏳ 載入資料與錯誤處理
- 開始發送 API →
isLoading = true
→ 顯示「載入中」 - 回傳成功 →
data = {...}
→ 顯示內容 - 回傳失敗 →
error = "無法連線伺服器"
→ 顯示錯誤畫面
小結:狀態,其實就是「畫面會變的原因」
對初學者來說,與其死記什麼是 state,不如這樣記:
只要畫面會變,背後就一定有「狀態」改變了。
你可以透過觀察使用者操作後「畫面有什麼變化」,來反推有哪些資料是狀態。
等到你學習 React、Vue、或其他前端框架時,會發現這些框架都在幫助你更有效地管理狀態,讓畫面自動跟著資料變化而更新。