还能这么开发表单功能?请求库懒人版alova帮你高效解决各种表单

一个真实的表单案例

"最近在开发一个电商网站的下单流程,这个下单流程分多个步骤,从选择订单商品,到填写收货地址,再到选配送方式等等。

一开始我还沾沾自喜,想着表单开发而已,做起来应该很简单吧。谁知道一个多步骤的表单流程把我整得焦头烂额。

最大的两个难点是:

  1. 每个步骤对应一个组件,如何在不同组件间共享数据,保证数据能串联起来。
  2. 用户在中间步骤刷新页面,填写的信息就全部丢失了,这该如何避免。

我试过保存表单数据到本地存储,但实现起来非常麻烦,需要自己手动维护存储和读取逻辑。页面一多,复杂度就上升得非常高。

本来计划了两天完成的表单流程,我已经折腾了一周还没做完。项目被我拖得...就差被老板开掉了。"

以上是一个alova用户的真人真事,后来他跟我说,他使用了alovajs的表单Hook重构,他将多个步骤的表单流程通过表单Hook重构,结果只用了半天就完美解决了数据共享和草稿的问题,这速度提升惊人。

alovajs表单Hook

如果你也被表单开发折磨过,接下来我会介绍下alovajs的表单Hook,一定要接着看下去哦!

  • alova官网在这里。

  • 如果你也喜欢alovajs,请在Github仓库中贡献一颗star,这对我们非常重要。

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中提交,我们会在最快的时间解决。

同时也欢迎贡献你的一份力量,请移步贡献专区

往期文章

相关推荐
一路向前的月光3 小时前
Vue2中的监听和计算属性的区别
前端·javascript·vue.js
长路 ㅤ   3 小时前
vue-live2d看板娘集成方案设计使用教程
前端·javascript·vue.js·live2d
Jiaberrr4 小时前
Element UI教程:如何将Radio单选框的圆框改为方框
前端·javascript·vue.js·ui·elementui
程序员大金7 小时前
基于SpringBoot+Vue+MySQL的装修公司管理系统
vue.js·spring boot·mysql
道爷我悟了8 小时前
Vue入门-指令学习-v-html
vue.js·学习·html
无咎.lsy8 小时前
vue之vuex的使用及举例
前端·javascript·vue.js
工业互联网专业9 小时前
毕业设计选题:基于ssm+vue+uniapp的校园水电费管理小程序
vue.js·小程序·uni-app·毕业设计·ssm·源码·课程设计
计算机学姐9 小时前
基于SpringBoot+Vue的在线投票系统
java·vue.js·spring boot·后端·学习·intellij-idea·mybatis
twins352010 小时前
解决Vue应用中遇到路由刷新后出现 404 错误
前端·javascript·vue.js
qiyi.sky10 小时前
JavaWeb——Vue组件库Element(3/6):常见组件:Dialog对话框、Form表单(介绍、使用、实际效果)
前端·javascript·vue.js