codercup / unibest

unibest - 最好用的 uniapp 开发框架。unibest 是由 uniapp + Vue3 + Ts + Vite4 + UnoCss + UniUI 驱动的跨端快速启动模板,使用 VS Code 开发,具有代码提示、自动格式化、统一配置、代码片段等功能,同时内置了大量平时开发常用的基本组件,开箱即用,让你编写 uniapp 拥有 best 体验。
https://codercup.github.io/unibest-docs/
MIT License
1.29k stars 172 forks source link

增强 useRequest 钩子 #106

Closed JinliangYan closed 3 weeks ago

JinliangYan commented 3 weeks ago

Commit 1: 增加返回值和错误处理

在需要同步处理数据或者错误情况下,可以直接访问请求结果,并使用 try...catch 来处理错误。不必监听data和error,从而提高 useRequest 钩子的可用性和健壮性。

示例:

const { run } = useRequest(fetchData, { immediate: false })

try {
  const result = await run()
  console.log('成功:', result)
} catch (err) {
  console.error('失败:', err)
}

Commit 2: 增加 ensureImmediate 选项以避免生命周期钩子错误

这些更改可以避免在 setup 函数之外使用钩子时出现的 onLoad 只能在 setup 内使用的错误(Lifecycle injection APIs can only be used during execution of setup()),确保请求能够在钩子调用时立即执行。

其他解决方法是将 immediate 设置为 false,然后手动调用 run,但我觉得这样比较麻烦,所以增加了一个 ensureImmediate 选项。

示例:

Xiphin commented 3 weeks ago

immediate 和 ensureImmediate 有点重复的意思,是否考虑合并成一个参数

JinliangYan commented 3 weeks ago

immediate 和 ensureImmediate 有点重复的意思,是否考虑合并成一个参数

确实,我觉得可以改成这样,消除消除 immediate 和 ensureImmediate 的潜在混淆

Xiphin commented 3 weeks ago

immediate 和 ensureImmediate 有点重复的意思,是否考虑合并成一个参数

确实,我觉得可以改成这样

  • 将 immediate 和 ensureImmediate 合并为 immediate
  • 引入一个新的boolean类型参数 autoRun,当其为 true 时,即可在调用钩子时立即执行请求;否则,在 onLoad 中执行。

再简化一下,不考虑 onLoad 呢

if (options.immediate) {
    // 钩子调用时立即执行请求
    run()
}

onLoad 会有什么特殊场景需要?

JinliangYan commented 3 weeks ago

immediate 和 ensureImmediate 有点重复的意思,是否考虑合并成一个参数

确实,我觉得可以改成这样

  • 将 immediate 和 ensureImmediate 合并为 immediate
  • 引入一个新的boolean类型参数 autoRun,当其为 true 时,即可在调用钩子时立即执行请求;否则,在 onLoad 中执行。

再简化一下,不考虑 onLoad 呢 if (options.immediate) { // 钩子调用时立即执行执行请求 run() } onLoad 会有什么特殊场景需要?

可能在setup生命周期中会有一些必要的变量初始化,这些变量要被请求函数用到,所以要指定到在onLoad生命周期钩子中运行。我的理解是这样的,有误还请指正。

Xiphin commented 3 weeks ago

如果有一些必要的变量初始化,这些变量要被请求函数用到的话,不用 immediate 不就行了

Xiphin commented 3 weeks ago

如果有一些必要的变量初始化,这些变量要被请求函数用到的话,不用 immediate 不就行了

immediate 默认 false, 然后在 onLoad 里 run(), run 在 onLoad 里的调用位置也可以轻松控制

JinliangYan commented 3 weeks ago

如果有一些必要的变量初始化,这些变量要被请求函数用到的话,不用 immediate 不就行了

immediate 默认 false, 然后在 onLoad 里 run(), run 在 onLoad 里的调用位置也可以轻松控制

减法确实是最优解,我光顾着加了。我revert一下。

Xiphin commented 3 weeks ago

记得基于 base 分支进行 PR

JinliangYan commented 3 weeks ago

记得基于 base 分支进行 PR

好的