一个真实的表单案例
"最近在开发一个电商网站的下单流程,这个下单流程分多个步骤,从选择订单商品,到填写收货地址,再到选配送方式等等。
一开始我还沾沾自喜,想着表单开发而已,做起来应该很简单吧。谁知道一个多步骤的表单流程把我整得焦头烂额。
最大的两个难点是:
- 每个步骤对应一个组件,如何在不同组件间共享数据,保证数据能串联起来。
- 用户在中间步骤刷新页面,填写的信息就全部丢失了,这该如何避免。
我试过保存表单数据到本地存储,但实现起来非常麻烦,需要自己手动维护存储和读取逻辑。页面一多,复杂度就上升得非常高。
本来计划了两天完成的表单流程,我已经折腾了一周还没做完。项目被我拖得...就差被老板开掉了。"
以上是一个alova用户的真人真事,后来他跟我说,他使用了alovajs的表单Hook重构,他将多个步骤的表单流程通过表单Hook重构,结果只用了半天就完美解决了数据共享和草稿的问题,这速度提升惊人。
alovajs表单Hook
如果你也被表单开发折磨过,接下来我会介绍下alovajs的表单Hook,一定要接着看下去哦!
alovajs的表单Hook的主要优点包括:
- 支持表单草稿,页面刷新也可以恢复表单数据,用户不用重新填写
- 可以自动重置表单,再也不用一个个重置表单项了
- 多步骤表单可以共享数据,解决了多表单间数据依赖问题
- 支持条件筛选表单,可以方便实现条件过滤查询
- 提供了提交状态、响应结果等统一的Hook,使用简单
- 只需要几行代码即可实现复杂的表单逻辑,不怕表单场景了
接下来让我们来看看如何使用它!
简单易懂的用法
alovajs的表单Hook用法非常简单,声明式使用表单Hook就可以了,只需要传入提交函数和配置参数即可,它会返回表单数据、提交状态、事件绑定函数等表单必要的相关信息,以下是一个基本用法。
如果看不懂的话,可能得先看下alova的快速入门学习下alova的基本用法。
js
const {
// 提交状态
loading: submiting,
// 响应式的表单数据,内容由initialForm决定
form,
// 提交数据函数
send: submit,
// 提交成功回调绑定
onSuccess,
// 提交失败回调绑定
onError,
// 提交完成回调绑定
onComplete
} = useForm(
formData => {
// 提交表单时会触发这个函数,可以在此转换表单数据并提交
return submitData(formData);
},
{
// 初始化表单数据
initialForm: {
name: '',
cls: '1'
}
}
);
// 提交表单数据
const handleSubmit = () => {
// 验证表单数据...
submit();
};
实现多步骤下单
刚才我们提到的电商下单流程,现在我们就用这个案例,看看如何使用 alovajs 的表单 Hook 来实现。
这个下单流程一共分为选择订单商品、选地址、选择配送方式三个步骤。不同步骤间需要共享用户的下单数据,以便在最后一步提交时可以访问到全部的表单数据。
rust
选择订单商品 -> 选择地址 -> 选择配送方式
为了便于各位理解,我做了适当的简化。
步骤1
在第一个组件,即选择地址中初始化表单数据和useForm的配置参数,并设置一个唯一id。
js
const { form, updateForm } = useForm(orderData => {
return submitData(orderData);
}, {
id: 'order'
initialForm: {
orderList: [], // 商品列表
address: '', // 收货地址
delivery: '' // 配送方式
},
// 设置这个参数为true即可在提交完成后自动重置表单数据
resetAfterSubmiting: true,
// 开启持久化保存数据,设置为true后将实时持久化未提交的数据
store: true
});
步骤2
在接下来的两个组件中,每个组件内使用表单Hook,并传入同一个id,这样就可以获得同一份表单数据、提交状态、事件绑定函数等。
js
// 可以在第一个参数直接传入相同的id,此时获取到的form和步骤1的是同一份引用
const { form, send, updateForm, onSuccess, onError, onComplete } = useForm('order');
步骤3
在最后一个组件内,调用 send
提交整个表单数据
下面是示例代码:
js
// 可以在第一个参数直接传入相同的id,此时获取到的form和步骤1的是同一份引用
const {
loading: submiting, // 提交状态
form,
send: submitForm
} = useForm('order');
// 提交整个表单
const handleSubmitBtnClick = () => {
submitForm();
};
通过设置相同的 id,不同组件可以共享同一份表单数据。并且表单数据会被自动持久化,不怕刷新丢失。
这样,就很轻松地实现一个多步骤的下单流程了。
小结
通过这个案例可以看出,alovajs 的表单 Hook 为我们解决了很多痛点,极大地简化了表单开发。
如果你也遇到过类似的表单开发困扰,就试试 alovajs 吧!
后续我会继续介绍 alovajs 的更多用法,敬请期待。
alovajs还提供了其他强大的请求策略:
名称 | 描述 | 文档 |
---|---|---|
分页请求策略 | 自动管理分页数据,数据预加载,减少不必要的数据刷新,流畅性提高 300%,编码难度降低 50% | usePagination |
无感数据交互策略 | 全新的交互体验,提交即响应,大幅降低网络波动造成的影响,让你的应用在网络不稳定,甚至断网状态下依然可用 | useSQRequest |
表单提交策略 | 为表单提交而设计的 hook,通过此 hook 你可以很方便地实现表单草稿、多页面(多步骤)表单,除此以外还提供了表单重置等常用功能 | useForm |
文件上传策略 | 更简单的文件上传策略,支持对 base64、Blob、ArrayBuffer、Canvas 数据的自动识别和转换 | useUploader |
发送验证码 | 验证码发送 hook,减掉你在开发验证码发送功能时的繁琐。 | useCaptcha |
自动重新拉取数据 | 在一定条件下自动重新拉取数据,保证始终展示最新数据。 | useAutoRequest |
跨组件触发请求 | 一个 alova 中间件,消除组件层级的限制,在任意组件中快速地触发任意请求的操作函数 | actionDelegationMiddleware |
串行请求的 useRequest | 比alova 的串行请求方式更加简洁易用的串行请求 use hook,提供统一的 loading 状态、error、回调函数 | useSerialRequest |
串行请求的 useWatcher | 比alova 的串行请求方式更加简洁易用的串行请求 use hook,提供统一的 loading 状态、error、回调函数。 | useSerialWatcher |
请求重试策略 | 请求失败自动重试,它在重要的请求和轮询请求上发挥重要作用 | useRetriableRequest |
SSE 请求 | 通过 Server-sent Events 进行请求 | useSSE |
想学习更多alovajs的用法,欢迎来alova官网学习。如果你也喜欢alovajs,请在Github仓库中贡献一颗star,这对我们非常重要。
如果觉得文章对你有帮助,请别吝啬你的赞和评论哈,说说你对alovajs怎么看的,或者可以问一些问题,我会尽量回答的,你的支持是我创作的最大动力!哈哈哈哈哈哈~
欢迎加入交流社区
有任何问题,你可以加入以下群聊咨询,也可以在github仓库中发布Discussions,如果遇到问题,也请在github的issues中提交,我们会在最快的时间解决。
同时也欢迎贡献你的一份力量,请移步贡献专区。