✅ created 是最安全的首次请求入口,此时响应式已就绪但 DOM 未挂载;⚠️ 避免在 beforeUpdate/updated 中发请求以防循环调用;? 手动刷新应封装为 methods 方法并显式调用;? beforeDestroy 中需取消请求或校验组件存活状态。

Options API(即 Vue 2 的选项式 API)中,异步请求的发起位置直接影响组件行为是否稳定。关键不是“能不能发”,而是“在哪个生命周期、用什么方式发,才能避免重复请求和状态错乱”。
✅ 在 created 中发起首次数据请求
created 是最常用且安全的首次请求入口。此时组件实例已创建、data 已初始化、响应式系统就绪,但 DOM 尚未挂载,适合做数据预加载。
- 请求逻辑与视图渲染解耦,不会因 DOM 操作失败而中断
- 比 beforeMount 更早,能更早开始网络等待,提升首屏体验
- 避免在 data() 中直接调用异步函数(会破坏响应式初始化流程)
⚠️ 不要在 beforeUpdate 或 updated 中发请求
这两个钩子会在每次响应式数据变化后触发,极易造成循环请求:
- 比如请求成功后 this.list = res.data → 触发更新 → updated 执行 → 再次请求 → 无限循环
- 即使加了防抖或标志位,也属于反模式:违背了“数据驱动视图”的设计原则
? 需要手动刷新时,封装成方法并显式调用
如果用户点击“刷新”按钮,或路由参数变化需重拉数据,不要依赖生命周期自动触发,而应:
- 把请求逻辑抽成 methods 中的独立方法(如 fetchList())
- 在 mounted 后监听 $route 或 $watch 监听关键参数,调用该方法
- 配合 loading 状态和错误捕获,避免多次点击重复提交
? 在 beforeDestroy 中清理副作用
若请求返回较慢(如用户快速跳转),需防止回调更新已销毁组件的状态:
- 使用 axios.cancelToken 或 AbortController 主动取消未完成请求
- 或用布尔标志位(如 this.isAlive = true / false)在回调中校验组件存活状态
- 注意:Vue 2 不支持 setup 和 cleanup 函数,必须手动管理


















