目录前序hook的场景useGetJobList共同思路历程心得utils 和 hook 的区别总结前序 近期公司的新项目一个小程序,一直想尝试 vue3 开发项目,苦于自己的驱动力
近期公司的新项目一个小程序,一直想尝试 vue3 开发项目,苦于自己的驱动力不行,学的零零碎碎的。因此小程序我直接跟项目组长说我要使用 uniapp 的 Vue3 版进行开发。开发中遇到业务场景相同的,就分装了一个hook 来减少代码,易于维护。
这种获取列表的需求很常见吧,在我这个小程序中有3处使用到了获取列表的功能。分别是: 我的收藏、已投递岗位、未投递岗位。
当然展示岗位的 card 我是分装了一个组件,很简单的业务组件,这里也不会描述。
假如: 我的收藏、已投递岗位、未投递岗位 都各自获取列表,就会出现重复性的定义以下代码
const getJobParameter = Reactive<paramsType>({
page: 1,
pageSize: 10,
code: null,
releaseJobName: null,
});
const jobList = ref([] as Array<jobType>);
const total = ref(0);
onLoad(() => {
getlist();
});
onReachBottom(() => {
if (jobList.value.length < total.value) {
getJobParameter.page++;
getlist();
}
});
async function getlist() {
const res: any = await fn(getJobParameter);
jobList.value = await [...jobList.value, ...res.data.data.dataList];
total.value = res.data.data.total;
}
3个页面都要写上: 定义变量 -> 初始获取 -> 获取的代码判断 -> 底部触发的代码。因此就直接分装了一个 hook。
import { onLoad, onReachBottom } from '@dcloudio/uni-app';
import { ref, reactive } from 'vue';
import { jobType } from '@/types/job-hunting';
interface paramsType {
page: number;
pageSize: number;
code: string | null;
releaseJobName: string | null;
}
export function useGetJobList(fn) {
const getJobParameter = reactive<paramsType>({
page: 1,
pageSize: 10,
code: null,
releaseJobName: null,
});
const jobList = ref([] as Array<jobType>);
const total = ref(0);
onLoad(() => {
getlist();
});
onReachBottom(() => {
if (jobList.value.length < total.value) {
getJobParameter.page++;
getlist();
}
});
async function getlist() {
const res: any = await fn(getJobParameter);
jobList.value = await [...jobList.value, ...res.data.data.dataList];
total.value = res.data.data.total;
}
async function refresh() {
getJobParameter.page = 1;
jobList.value = [];
await getlist();
return true;
}
return {
jobList,
refresh: () => refresh(),
};
}
已上代码就是简单的获取到岗位的 list 还未进行操作。
因为首页有城市的选择、岗位的搜索等功能。
下面是我开始时的想法(错误):
我想着要不把 getJobParameter 的参数全部暴露出去,然后对这些参数进行操作,但是内心感觉怪怪的,这样跟不分装好像区别也不大,又思考要不在 useGetJobList 加一个参数用来传递 参数的变化,当然这个也是行不通的。
后面看了别人分装的 hook。就有了以下代码。
import { onLoad, onReachBottom } from '@dcloudio/uni-app';
import { ref, reactive } from 'vue';
import { jobType } from '@/types/job-hunting';
interface paramsType {
page: number;
pageSize: number;
code: string | null;
releaseJobName: string | null;
}
export function useGetJobList(fn) {
const getJobParameter = reactive<paramsType>({
page: 1,
pageSize: 10,
code: null,
releaseJobName: null,
});
const jobList = ref([] as Array<jobType>);
const total = ref(0);
onLoad(() => {
getlist();
});
onReachBottom(() => {
if (jobList.value.length < total.value) {
getJobParameter.page++;
getlist();
}
});
async function getlist() {
const res: any = await fn(getJobParameter);
jobList.value = await [...jobList.value, ...res.data.data.dataList];
total.value = res.data.data.total;
}
async function refresh() {
getJobParameter.page = 1;
jobList.value = [];
await getlist();
// 这个后面的代表异步了
return true;
}
function reset () {
getJobParameter.page = 1;
getJobParameter.code = null;
getJobParameter.releaseJobName = null;
}
function queryList(searchValue: string | null) {
reset();
getJobParameter.releaseJobName = searchValue;
getlist();
}
function codeChange(code: string | null) {
reset();
getJobParameter.code = code;
getlist();
}
return {
jobList,
queryList: (searchValue: string | null) => queryList(searchValue),
codeChange: (code: string | null) => codeChange(code),
refresh: () => refresh(),
};
}
这里为 重新定两个函数 分别是 queryList、codeChange,用来搜索和城市code 改变再获取 岗位列表。
queryList: (searchValue: string | null) => queryList(searchValue),
codeChange: (code: string | null) => codeChange(code),
上面代码还有一个心得,就是在 return 是可以直接把函数写为什么要再分装一个函数出来?
之前我一直搞不清楚 hook 和 utils 的区别,我感觉差不多都是分装一个函数出来。
区别: utils 是一个简单的参数传入,然后返回,返回的变量不具有响应式。没有使用到 Vue 的 reactive、ref等钩子函数, 我认为当你使用了这些钩子函数就可以说它是一个 hook。
hook 有点想面向对象的语言的 class, 内部定义的变量,最好自己内部的做处理,只需暴露出一个函数。
以上就是Composition api封装业务hook思路示例分享的详细内容,更多关于Composition Api封装hook的资料请关注编程网其它相关文章!
--结束END--
本文标题: CompositionApi封装业务hook思路示例分享
本文链接: https://lsjlt.com/news/154119.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-01-12
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0