做产品 PMaker
空格的键盘
事前拦一道
确定要删除吗?
删除后无法恢复
确定 取消
问得多了,用户开始闭眼点确定
真删错的那次也拦不住
事后给退路
已删除 1 项 撤销
常规操作不被打断
删错了五秒内点一下就回来

确认弹窗保护的是极少数误操作,代价是打断了绝大多数正常操作。撤销刚好反过来。

Undoable Beats Confirm

Rather than asking "are you sure" before the action, let it happen first and offer a window to undo.

What you'll run into
  • 用户对所有确认弹窗都直接点确定,从来不读
  • 批量操作时要一个个确认,烦到不想用
  • 真的删错了,除了找你恢复没有别的办法

The problem with confirmation dialogs is that their cost distribution is inverted: out of a hundred actions, maybe one is a mistake—but all a hundred get interrupted. And once dialogs become routine, users form muscle memory and click "confirm" on reflex—the one genuine mistake still slips through.

Undo moves the cost onto the one time something goes wrong: normal actions aren't interrupted at all, and the error case costs one second to click undo.

When you still need to confirm

情况用哪种为什么
删一条笔记、归档一封邮件撤销可逆,影响只在自己
批量删除、批量修改状态撤销逐个确认会让人放弃使用
发送消息、提交表单撤销给几秒钟的撤回窗口就够
付款、转账确认钱出去了收不回来
作废合同、公开发布确认影响到别人,且对外可见
物理删除、清空数据确认真的没了。这时候还要提高确认成本
The test has two criteria: is the action reversible, and how many people does the consequence affect. If both answers are "reversible, only affects me," use undo.

When confirmation really is needed, raise its cost so it can't be clicked through on reflex: require typing the contract number, turn the primary button into a danger color, replace "confirm" with a specific verb ("void the contract" instead of "confirm").

一格是一次操作,红色那格是真正的误操作 先确认再执行 五十次操作,五十次都被打断 而其中只有一次是误操作 —— 成本分摊反了 先执行,给一个能反悔的窗口 正常操作完全不被打断 出错的那一次,花一秒钟点一下撤销 而且弹得多了,用户会形成肌肉记忆——看到弹窗直接点确定,那一次真正的误操作照样拦不住。 判断依据只有两条:这个动作可不可逆、后果影响几个人。两条都答「可逆、只影响自己」,就用撤销。
The test has two criteria: is the action reversible, and how many people does the consequence affect. If both answers are "reversible, only affects me," use undo.

How to implement undo

This approach has a side benefit for vibecoding: soft delete plus undo essentially means data never really disappears. AI-generated code has a non-trivial chance of getting delete logic wrong; this safety net makes the cost of those errors much lower.