vue options
通常,use hook 只能在 vue 的 setup 中使用,但通过@alova/vue-options
提供的辅助函数,你也可以在 vue 的 options 中使用 alova 的 use hook,完美兼容 alova 的几乎所有功能,你可以在 options 下使用alova/client
的所有客户端请求策略。
vue2 和 vue3 中均可使用。
安装
- npm
- yarn
- pnpm
npm install alova @alova/vue-options --save
yarn add alova @alova/vue-options
pnpm install alova @alova/vue-options
版本要求
alova 版本 >= 3.0.0
vue 版本 >= 2.17.0
用法
映射 hook 状态和函数到 vue 实例上
先使用vueOptionHook
创建 alova 实例。
import { createAlova, Method } from 'alova';
import adapterFetch from 'alova/fetch';
import { VueOptionsHook } from '@alova/vue-options';
// api.js
const alovaInst = createAlova({
baseURL: 'http://example.com',
statesHook: VueOptionsHook,
requestAdapter: adapterFetch(),
responded: response => response.json()
});
/** @type {() => Method<unknown, unknown, { content: string, time: string }[]>} */
export const getData = () => alovaInst.Get('/todolist');
再使用mapAlovaHook
将 use hook 的返回值集合映射到组件实例上,以下是访问响应式状态和操作函数的方法:
- 可以通过集合的 key 来访问
loading/data/error
等响应式状态,例如this.key.loading
、this.key.data
。 - 可以通过集合的 key 加函数名称来访问操作函数,并使用
$
拼接,例如this.key$send
、this.key$onSuccess
。
以下是一个完整的例子。
<template>
<div>
<span role="loading">{{ todoRequest.loading ? 'loading' : 'loaded' }}</span>
<span role="error">{{ todoRequest.error ? todoRequest.error.message : '' }}</span>
<div role="data">{{ JSON.stringify(todoRequest.data) }}</div>
<button
@click="todoRequest$send"
role="btnSend">
send
</button>
</div>
</template>
<script>
import { useRequest } from 'alova/client';
import { mapAlovaHook } from '@alova/vue-options';
import { getData } from './api';
export default {
// mapAlovaHook将返回mixins数组,use hook的用法与之前一致
mixins: mapAlovaHook(function (vm) {
// 可以通过this或vm来访问组件实例
// 使用this时,此回调函数不能为箭头函数
console.log(this, vm);
return {
todoRequest: useRequest(getData)
};
}),
created() {
this.todoRequest.loading;
this.todoRequest$send();
this.todoRequest$onSuccess(event => {
event.data.match;
event.args.copyWithin;
});
this.todoRequest$onSuccess(event => {
console.log('success', event);
});
this.todoRequest$onError(event => {
console.log('error', event);
});
},
mounted() {
this.todoRequest$onComplete(event => {
console.log('complete', event);
});
}
};
</script>
计算属性
如果你需要定义依赖 hook 相关的请求状态的计算属性,只需要和平时一样编写即可。
export default {
computed: {
todoRequestLoading() {
return this.todoRequest.loading;
},
todoRequestData() {
return this.todoRequest.data;
}
}
};
监听 hook 状态变化
监听状态也与 vue 的用法一致。
export default {
watch: {
'todoRequest.loading'(newVal, oldVal) {
// ...
}
}
};