结合UI框架
接下来,我们将学习如何与客户端的 UI 框架结合使用,这可以让 alova 发挥出真正的力量,在 UI 框架中使用时,不仅可以让 alova 自动管理响应式的请求状态,还能通过一定规则自动控制什么时候应该发送请求。
alova中提供了 15+个客户端的请求策略,它们帮助你以简单优雅的用法实现复杂的请求,让我们继续往下看吧!
设置 statesHook
alova 的 useHook 请求策略可以在所有 alova 支持的 UI 框架中运行,只需要在 alova 实例上设置对应 UI 框架的 statesHook 即可,它将告诉 alova 应该使用哪个 UI 框架来创建 states。
- vue
- react/next
- nuxt
- svelte
- solid
- vue-demi
import { createAlova } from 'alova';
import VueHook from 'alova/vue';
export const alovaInstance = createAlova({
// ...
statesHook: VueHook
});
import { createAlova } from 'alova';
import ReactHook from 'alova/react';
export const alovaInstance = createAlova({
// ...
statesHook: ReactHook
});
import { createAlova } from 'alova';
import NuxtHook from 'alova/nuxt';
export const alovaInstance = createAlova({
// ...
statesHook: NuxtHook({
nuxtApp: useNuxtApp
})
});
更多关于 NuxtHook 使用,可以参考 SSR#nuxt
import { createAlova } from 'alova';
import SvelteHook from 'alova/svelte';
export const alovaInstance = createAlova({
// ...
statesHook: SvelteHook
});
import { createAlova } from 'alova';
import SolidHook from 'alova/solid';
export const alovaInstance = createAlova({
// ...
statesHook: SolidHook
});
import { createAlova } from 'alova';
import VueDemiHook from 'alova/vue-demi';
// 支持vue@2.7+ composition api
export const alovaInstance = createAlova({
// ...
statesHook: VueDemiHook
});
此外,alova 还提供了以下 statesHook:
- vue options 风格的 statesHook,这意味着你可以在 vue2 的 options 风格组件中使用 alova 的 usehooks。
自动管理请求状态
useRequest是我们最常用的请求策略,它可以帮我们创建和维护请求的响应式状态,如loading/data/error等,你可以直接在视图中使用这些响应式状态,当它们更改时,视图也将随之变化。
useRequest 表示一次请求的发送,调用时默认将发送一次请求。
- vue
- react
- svelte
- solid
<script>
import { useRequest } from 'alova/client';
import { alovaInstance } from './api';
// 使用alova实例创建method并传给useRequest即可发送请求
const { loading, data, error, send, update } = useRequest(
alovaInstance.Get('/todos/1', {
cacheFor: 0
}),
{
initialData: {}, // 设置data状态的初始数据
immediate: true // 是否立即发送请求,默认为true
}
).onSuccess(event => {
event.method; // 当前请求的method
event.data; // 当前请求的响应数据
});
const handleSend = () => {
send();
};
const handleUpdate = () => {
update({
data: { title: 'new title' }
});
// 也可以直接修改data值
// $data = { title: 'new title' };
// data.update(d => ({ title: 'new title' }));
}
</script>
{#if $loading}
<div>Loading...</div>
{:else if $error}
<div>{ $error.message }</div>
{:else}
<div>
<div>请求结果: {{ data }}</div>
<button on:click={handleSend}>手动发送请求</button>
<button on:click={handleUpdate}>手动修改data</button>
</div>
{/if}
何时使用 useRequest ,何时通过await alovaInstance.Get 发送请求。
useHook 使用规范
请注意,useRequest只能用于组件内发送请求,在组件外,你可以通过 method 实例直接发送请求,并且 useRequest 的使用需要符合 use hook 使用规则,即只能在函数最外层调用。
❌❌❌ 不推荐在在循环、条件判断或者子函数中调用,例如以下在 click 回调中的使用示例,在回调函数中使用时,虽然可以正常发起请求,但 use hook 返回的响应式数据无法在视图中使用,循环和条件判断中使用也是如此。
// ❌ bad
const handleClick = () => {
const { loading, data } = useRequest(getter);
};
// -------
// ✅ good
const { loading, data, send } = useRequest(getter, {
immediate: false
});
const handleClick = () => {
send();
};