用声明式实现复杂请求,让代码优雅度直线上升

前言

传统的请求工具例如axios、fetch函数等,都只提供了最基本的请求发送和接收功能,不过,在实际项目中,请求并不会单独存在,你可能需要根据不同的请求场景自定义实现一些请求逻辑,以及维护请求相关的状态,每次遇到这些稍复杂的请求场景,比如分页、表单提交、发送验证码等等,都要写一大堆代码才能搞定,写完后结果Bug还层出不穷,这种情况真的是让我潸然泪下啊!

来推荐一个我们的请求策略库alovajs,它让请求和接口维护变得非常简单。

alovajs 是什么

alovajs是一个请求策略库,就是说它专门用来搞定各种复杂的请求场景的。你只要用它提供的Hook来声明你要的请求策略,alovajs就会帮你自动管理状态、发送请求、处理响应等等。 比如分页、表单、验证码这些场景,你都可以用极其简洁的代码就实现功能全的请求逻辑!

  • alova官网在这里。

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

信不信由你,但我保证alovajs绝对是提升你代码优雅度的利器!具体请继续往下看一些实际的例子。

各种常见的请求场景对应的声明式请求

基础请求

比如获取一个todo信息,使用 alovajs 的 useRequest hook 就很简单:

js 复制代码
// 和axios相似的参数风格
const todoDetail = alova.Get('/todo', {
  params: {
    id: 1
  }
});


const {
  loading,
  data,
  error,
  onSuccess,
  onError,
  onComplete,
  send,
  abort,
  update
} = useRequest(todoDetail);

useRequest 会自动帮你管理 loading、data、error 等状态,不需要自己控制!

useRequest详细文档

状态变化请求

在数据筛选、搜索等交互中,可以通过 useWatcher 来监听状态变化并发送请求:

js 复制代码
useWatcher(
  () => filterTodoList(page, keyword),
  [keyword, page],
  {
    debounce: [500, 0], // 请求级的防抖参数
  }
);

它还有请求防抖、保证请求时序、过滤状态变化时是否发送请求等功能,超方便!

useWatcher详细文档

预加载数据

可以用 useFetcher 预加载数据,不需要直接处理响应,但会更新相关状态:

js 复制代码
const {
  fetching,
  error,
  fetch
} = useFetcher();
fetch(todoDetail);

useFetcher详细文档

分页请求

分页场景下,page、pageSize、pageCount、total等等好多状态要自己维护,还要写一堆逻辑来判断何时应该发送请求!

如果用alovajs提供的分页Hook,你就只需要这样:

js 复制代码
const {
  // 加载状态
  loading,

  // 列表数据
  data,

  // 是否为最后一页
  // 下拉加载时可通过此参数判断是否还需要加载
  isLastPage,

  // 当前页码,改变此页码将自动触发请求
  page,

  // 每页数据条数
  pageSize,

  // 分页页数
  pageCount,

  // 总数据量
  total
} = usePagination((page, pageSize) => queryStudents(page, pageSize));

// 翻到上一页,page值更改后将自动发送请求
const handlePrevPage = () => {
  page.value--;
};

// 翻到下一页,page值更改后将自动发送请求
const handleNextPage = () => {
  page.value++;
};

// 更改每页数量,pageSize值更改后将自动发送请求
const handleSetPageSize = () => {
  pageSize.value = 20;
};

是不是清爽很多,节省了超多重复代码。

usePagination详细文档

表单提交

表单处理也很头疼吧?alova的useForm直接帮你搞定表单提交、表单草稿、自动重置表单项、多页共享数据啥的。

js 复制代码
const {
  form,
  send: submitForm,
  updateForm
} = useForm(formData => submitData(formData), {
  initialForm: {
    title: '',
    content: '',
    time: '',
  },
  resetAfterSubmiting: true
});

useForm详细文档

验证码实现

别再自己做倒计时了,这有!

js 复制代码
const {
  loading: sending,
  send: sendCaptcha
} = useCaptcha(() => sendCaptcha(mobile), {
  initialCountdown: 60
});

useCaptcha详细文档

文件上传策略

更简单的文件上传策略,支持对base64、Blob、ArrayBuffer、Canvas数据的自动识别和转换,还可以多文件同时上传、图片预览图生成

js 复制代码
const {
  fileList
  loading,
  progress
} = useUploader(({ file, name }) => uploadFile(file, name), {
  limit: 3,
  accept: ['png', 'jpg', 'gif'],
  imageTempLink: true
});

useUploader详细文档

自动重新拉取数据

可以在浏览器 tab 切换时拉取最新数据、浏览器聚焦时拉取最新数据、网络重连时拉取最新数据、轮询请求自动重新拉取数据,可以同时配置以上的一个或多个触发条件,也可以配置节流时间来防止短时间内触发多次请求,例如 1 秒内只允许触发一次。

js 复制代码
useAutoRequest(todoDetail, {
  enablePolling: 2000,
  enableVisibility: true,
  enableFocus: true,
  enableNetwork: true,
  throttle: 1000
}

useAutoRequest详细文档

跨组件请求策略

跨组件或模块触发请求相关操作,消除组件层级的限制,在任意组件中快速地触发任意请求的操作函数,例如,你可以某个组件中更新了菜单数据后,重新触发侧边菜单栏的重新请求,从而刷新数据。当操作了列表数据后,触发列表更新。

js 复制代码
// 组件A创建代理
useRequest(todoDetail, {
  middleware: actionDelegationMiddleware('someAction')
});

// 组件B内触发操作
accessAction('someAction', (actions) => {
  actions.send()
});

actionDelegationMiddleware详细文档

请求重试策略

在重要的请求上使用它,可以提高请求的稳定性,可以自定义设置是否重试,以及重试延迟,还有手动停止重试

js 复制代码
const {
  onRetry,
  onFail,
  stop,
} = useRetriableRequest(pay, {
  retry(error) {
    return /network timeout/i.test(error.message);
  },
  backoff: {
    delay: 2000
  }
});

useRetriableRequest详细文档

SSE

可以直接通过 SSE 进行请求,它可以通过全局响应和方法实例的函数transformData自动转换数据,还提供了对EventSource对象的全部控制。

js 复制代码
const {
  readyState,
  data,
  eventSource,
  onMessage,
  onError,
  onOpen,
  on
} = useSSE(() => chatGPT(), {
  withCredentials: true,
  interceptByGlobalResponded: true
});

useSSE详细文档

结尾

整体使用下来,个人感觉alovajs还是挺香的!它就是让请求开发回归简单的神器。让我们在网络请求方面效率和优雅度直线上升!

这里还有超多可运行的示例

如果觉得文章对你有帮助,请别吝啬你的赞和评论哈,说说你对alovajs怎么看的,或者可以问一些问题,我会尽量回答的,你的支持是我创作的最大动力!哈哈哈哈哈哈~

想学习更多alovajs的用法,欢迎来alova官网学习。如果你也喜欢alovajs,请在Github仓库中贡献一颗star,这对我们非常重要。

欢迎加入交流社区

有任何问题,你可以加入以下群聊咨询,也可以在github仓库中发布Discussions,如果遇到问题,也请在github的issues中提交,我们会在最快的时间解决。

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

往期文章

相关推荐
Devil枫3 小时前
Vue 3 单元测试与E2E测试
前端·vue.js·单元测试
GIS程序媛—椰子4 小时前
【Vue 全家桶】6、vue-router 路由(更新中)
前端·vue.js
毕业设计制作和分享5 小时前
ssm《数据库系统原理》课程平台的设计与实现+vue
前端·数据库·vue.js·oracle·mybatis
程序媛小果5 小时前
基于java+SpringBoot+Vue的旅游管理系统设计与实现
java·vue.js·spring boot
从兄6 小时前
vue 使用docx-preview 预览替换文档内的特定变量
javascript·vue.js·ecmascript
凉辰7 小时前
设计模式 策略模式 场景Vue (技术提升)
vue.js·设计模式·策略模式
薛一半8 小时前
PC端查看历史消息,鼠标向上滚动加载数据时页面停留在上次查看的位置
前端·javascript·vue.js
MarcoPage9 小时前
第十九课 Vue组件中的方法
前端·javascript·vue.js
工业互联网专业9 小时前
Python毕业设计选题:基于Hadoop的租房数据分析系统的设计与实现
vue.js·hadoop·python·flask·毕业设计·源码·课程设计
你好龙卷风!!!9 小时前
vue3 怎么判断数据列是否包某一列名
前端·javascript·vue.js