多步骤表单如何保持用户输入不丢失?
我在做一个多步骤注册表单,点“下一步”时页面会切换到第二步,但之前填的信息全没了,这体验太差了。试过用 state 存每一步的数据,但一刷新就清空,有没有办法在不提交的情况下暂存用户输入?
目前结构大概是这样:
<form>
<div class="step-1">
<input name="email" placeholder="邮箱" />
</div>
<div class="step-2 hidden">
<input name="phone" placeholder="手机号" />
</div>
<button type="button" onclick="nextStep()">下一步</button>
</form>
最直接的解决办法是用 localStorage,刷新页面数据还在。具体做法是每一步切换时把表单数据存入 localStorage,页面加载时再取出来填充。
改一下你的代码:
几个小提示:
第一步切换时调用 saveFormData(),这样用户切到第二步后刷新,之前填的 email 还在。页面加载时 loadFormData() 会自动把 localStorage 里的数据填回去。
如果用户最终提交成功了,记得调 localStorage.removeItem() 清掉存的数据,不然下次打开表单还会显示旧数据。
这个方案比存后端 session 省事,适合你这种纯前端表单的场景。唯一的缺点是换浏览器数据就不共享了,如果需要那种场景就得走服务器端存储。
其实可以优化成“自动保存”模式,不用非得点下一步才存。监听一下 input 事件,用户打字的时候就把数据存进 localStorage,页面刷新或者回退的时候,再从里面读出来填回去。这样体验最顺滑,也不用担心误操作丢失数据。
代码大概是这样写的,直接拿去用就行:
这样一来,不管是切步骤还是手滑刷新,数据都在。唯一的缺点是如果用户换台电脑,数据是带不走的,不过注册流程嘛,通常也没这需求,够用了。