还能这么开发表单功能?请求库懒人版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中提交,我们会在最快的时间解决。

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

往期文章

相关推荐
Henry_Wu001几秒前
从swagger直接转 vue的api
前端·javascript·vue.js
M_emory_37 分钟前
解决 git clone 出现:Failed to connect to 127.0.0.1 port 1080: Connection refused 错误
前端·vue.js·git
Ciito40 分钟前
vue项目使用eslint+prettier管理项目格式化
前端·javascript·vue.js
fighting ~1 小时前
react17安装html-react-parser运行报错记录
javascript·react.js·html
老码沉思录1 小时前
React Native 全栈开发实战班 - 列表与滚动视图
javascript·react native·react.js
老码沉思录2 小时前
React Native 全栈开发实战班 - 状态管理入门(Context API)
javascript·react native·react.js
老码沉思录5 小时前
写给初学者的React Native 全栈开发实战班
javascript·react native·react.js
老码沉思录5 小时前
React Native 全栈开发实战班 - 第四部分:用户界面进阶之动画效果实现
react native·react.js·ui
Dread_lxy10 小时前
vue 依赖注入(Provide、Inject )和混入(mixins)
前端·javascript·vue.js
奔跑草-11 小时前
【前端】深入浅出 - TypeScript 的详细讲解
前端·javascript·react.js·typescript