做产品 PMaker
空格的键盘空格的键盘
设计交互

可撤销优于确认

可撤销优于确认 | 设计交互 | 做产品

可撤销优于确认

与其在操作前问「你确定吗」,不如让操作先发生,再给一个能反悔的窗口。

你会遇到的现象

  • 用户对所有确认弹窗都直接点确定,从来不读

  • 批量操作时要一个个确认,烦到不想用

  • 真的删错了,除了找你恢复没有别的办法

确认弹窗的问题在于它的成本分摊反了:一百次操作里可能只有一次是误操作,但一百次都被打断。而且弹得多了,用户会形成肌肉记忆,看到弹窗直接点确定——那一次真正的误操作照样拦不住。

撤销把成本挪到了出错的那一次:正常操作完全不被打断,出错的那次花一秒钟点一下撤销。

什么时候还是要确认

情况用哪种为什么 删一条笔记、归档一封邮件撤销可逆,影响只在自己 批量删除、批量修改状态撤销逐个确认会让人放弃使用 发送消息、提交表单撤销给几秒钟的撤回窗口就够 付款、转账确认钱出去了收不回来 作废合同、公开发布确认影响到别人,且对外可见 物理删除、清空数据确认真的没了。这时候还要提高确认成本

判断依据是两条:这个动作可不可逆,以及后果影响几个人。两条都答「可逆、只影响自己」,就用撤销。

确实需要确认的时候,要提高确认的成本,让人无法条件反射地点过去:要求输入合同编号、把主按钮改成危险色、把「确定」换成具体的动词(「作废合同」而不是「确定」)。

一格是一次操作,红色那格是真正的误操作

先确认再执行

五十次操作,五十次都被打断 而其中只有一次是误操作 —— 成本分摊反了

先执行,给一个能反悔的窗口

正常操作完全不被打断 出错的那一次,花一秒钟点一下撤销

而且弹得多了,用户会形成肌肉记忆——看到弹窗直接点确定,那一次真正的误操作照样拦不住。 判断依据只有两条:这个动作可不可逆、后果影响几个人。两条都答「可逆、只影响自己」,就用撤销。

确实需要确认的时候,反而要提高确认的成本,让人无法条件反射地点过去:要求输入合同编号、把主按钮改成危险色、把「确定」换成具体的动词(「作废合同」而不是「确定」)。

撤销怎么做

  • **底层用软删除。**加一个删除标记而不是真的删掉。有了它,撤销就是把标记改回来,成本极低。

  • **撤销入口跟结果反馈放在一起。**删除后的提示条上直接带「撤销」,用户不用去别处找。

  • **窗口期给足。**五到十秒是常见值。批量操作可以更长,或者干脆做成回收站。

  • **撤销之后要能看到东西回来了。**只弹一句「已撤销」不够,列表里那一条要真的出现。

  • **回收站是撤销的长期版本。**短窗口来不及的时候,用户还有第二条路。

这套做法对 vibecoding 有个额外好处:软删除加撤销,本质上是让数据不会真的消失。AI 生成的代码在删除逻辑上出错的概率不低,有这一层兜底,出错的代价小很多。

接着看

操作必有反馈 撤销入口就长在结果反馈上。那一篇讲三层反馈分别该出现在什么时候。

提示的五种形式 很多确认弹窗其实是越级使用了强提示。改成撤销之后,强度可以降到轻提示。

数据模型先行 软删除标记要在建表时就加上。后补的话,已有数据的处理会很麻烦。