客户端策略
alova 的客户端策略分为 中间件、拦截器、useHook 三种,当你的项目需要自定义时,你可以参考这个章节。
中间件
中间件提供了强大的、几乎能控制一个请求的所有行为的能力,你可以通过它控制请求行为、自定义修改请求状态、错误处理等,详情请前往请求中间件查看,以下的源码可以告诉你中间件到底能做什么。
- actionDelegationMiddleware 通过中间件中实现了跨组件触发请求。
- useSQRequest 在中间件中实现立即响应请求,无需等待。
- useSerialRequest 在中间件中串行请求并管理多个请求的响应数据。
- useRetriableRequest 在中间件中重试失败的请求。
- 延迟更新 loading示例。
拦截器
拦截器控制全局的请求前后行为,我们可以包装全局拦截器实现特定功能的拦截器。
以下是一个示例,它在特定条件下中断所有进行中的请求。
const methodsAborter = (handler, detector) => {
let requestingMethods = [];
// 返回请求前拦截器
return method => {
if (detector()) {
requestingMethods.forEach(method => {
method.abort();
});
return;
}
requestingMethods.push(method);
method.promise
?.then(() => {
requestingMethods = requestingMethods.filter(item => item !== method);
})
.catch(() => {}); // 防止抛出错误
handler(method);
};
};
createAlova({
beforeRequest: methodsAborter(
method => {
// 原请求前钩子
},
() => {
// 中断请求判断条件
return false;
}
)
});
一个更复杂的示例,token 认证拦截器
useHook
useHook 是 alova 最常用的请求策略,而且它是跨 UI 框架的,当你为特定 UI 框架编写 useHook 时和普通的 useHook 一样编写即可,这里我们主要了解编写跨 UI 框架的 useHook 编写。
我们创新性地使用了状态代理来抹平 UI 框架状态的差异性,它的 用法类似 Vue 的 ref 值,只需要通过简单的访问 v 属性,或对 v 属性赋值,不再需要关心 UI 框架的差异性。
为了抹平状态代理的差异性,我们提供了statesHookHelper
函数来创建辅助函数,通过这些辅助函数来实现跨 UI 框架的 useHook。
import { statesHookHelper } from 'alova/client';
import { promiseStatesHook } from 'alova';
function myUseHook(methodHandler, options) {
const {
create,
computed,
ref,
onMounted,
onUnmount,
watch,
objectify,
exposeProvider,
__referingObj
} = statesHookHelper(promiseStatesHook());
}
接下来让我们来详细了解他们。
创建状态
使用create
创建 UI 框架无关状态代理 FrameworkState,以 loading 状态为例。
// 参数1:为初始值
// 参数2:导出key
const loading = create(false, 'loading');
// 获取原始值
const dehydratedLoading = loading.v;
// 更新状态值
loading.v = true;
// 获取导出值,内部调用`statesHook.export`导出值
const exportedLoading = loading.e;
// 获取通过statesHook.create创建的,平台相关的状态值
const platformedState = loading.s;