跳至主要内容
💬 回報這一頁

唯讀逐欄編輯

問題

主檔表單有 30 個欄位。使用者打開它,通常只是要改其中一個。

一整片輸入框帶來三個問題:

  1. 分不清改了哪些 —— 所有欄位長得一模一樣,送出前無從確認
  2. 容易誤改 —— 滑鼠滾輪掃過數字欄就改掉值,而且不會發現
  3. 看起來像草稿 —— 明明是已生效的正式資料,卻長得像還沒填完的表單

做法

預設唯讀,逐欄點開。

唯讀態(像值,帶淡鉛筆)
↓ 點擊
編輯態(真正的輸入框,自動聚焦)
↓ 改值
已變更態(整欄琥珀 +「已變更」標籤 + 還原鈕)
↓ Esc / blur
唯讀態(保留琥珀)

四個要素缺一不可:

要素為什麼
唯讀態要有可發現線索(淡鉛筆)否則使用者不知道能點
改動要整欄標色掃一眼就知道改了哪些
要有逐欄還原改錯一格不必整頁重來
undo/redo 先確認舊值→新值還原本身也是一次資料變更

搭配送出前變更摘要,形成完整迴路。

四種狀態並列(第二欄是已變更態)

唯讀態:值的樣子,右側有淡鉛筆。

已變更

已變更態:整欄琥珀+還原鈕。改了什麼掃一眼就知道。

select 欄位:點擊即展開,不必多按一次。

U-1042

鎖定態:顯示鎖頭與原因,而不是直接不給點。

這是真元件

上面不是截圖——文件站直接編譯 packages/react 的原始碼。 元件改了,這裡當場跟著改。互動細節請到 EditableField 元件頁試。

取捨

代價:多一次點擊。 這在「主要是看、偶爾才改」的主檔表單划算, 在「每次都要全部填一遍」的建立表單不划算。

所以新增模式要關掉這個行為(alwaysEdittrackChanges={false})—— 新增時每個欄位都「不同於原值」,不關掉的話整張表都是琥珀色,訊號完全失效。

反例

✅ 這樣做

編輯/檢視是同一個畫面,只是欄位個別切換態。 使用者的心智模型是「我在改這一格」。

🚫 不要這樣

「檢視模式 / 編輯模式」全頁切換。使用者要先按「編輯」, 改完按「儲存」,中途想看別的欄位還得先取消。這是把資料庫的交易邊界 直接搬到介面上。

✅ 這樣做

改動用保留色(琥珀)標記,全站只有這一個意思。

🚫 不要這樣

不要用「儲存按鈕變亮」當唯一線索。使用者知道有東西改了, 但不知道是哪一格——尤其在他被電話打斷五分鐘之後。

實作

EditableFieldChangeSummaryuseRecordDiff。核心是一份 FieldSpec[] 宣告,同時驅動比對、顯示格式化與稽核記錄。