当前位置: 首页 > news >正文

详解Vue的生命周期:created和mounted到底该请求谁?

在 Vue 的生命周期中,createdmounted是两个关键阶段,它们在组件初始化过程中扮演不同角色,数据请求的选择取决于业务需求是否依赖 DOM 渲染。以下是具体分析与最佳实践:

一、createdmounted的核心区别

阶段触发时机核心特性典型用途
created组件实例创建完成,数据观测、事件配置就绪,但DOM 未挂载$el不可用。可访问datamethodscomputed,能发起异步请求,但无法操作真实 DOM。数据初始化、非 DOM 依赖的异步请求(如 API 调用)、事件监听注册。
mounted组件挂载到 DOM 后触发,$el可用,模板已渲染为真实 DOM。可安全操作 DOM,访问子组件实例(通过ref),但数据变更不会重新触发此阶段。DOM 依赖操作(如插件初始化、DOM 尺寸计算)、需要渲染后数据的异步请求(如图表库)。

二、数据请求:created还是mounted

1. 优先选择created的场景
  • 目的:尽早获取数据,减少用户等待时间。
  • 适用场景
    • 数据不依赖 DOM 渲染(如用户信息、列表数据)。
    • 需在模板渲染前准备好数据(避免闪烁或空状态)。
    • 非 DOM 操作(如设置全局状态、发送分析事件)。
  • 示例
    exportdefault{data(){return{userList:[]};},created(){axios.get('/api/users').then(response=>{this.userList=response.data;// 数据在模板渲染前就绪});}};
2. 选择mounted的场景
  • 目的:确保 DOM 存在后再执行操作,避免报错。
  • 适用场景
    • 数据请求依赖 DOM 元素(如获取输入框默认值、计算容器高度)。
    • 初始化第三方库(如 Chart.js、ECharts、地图插件)。
    • 需操作子组件或 DOM 引用(ref)。
  • 示例
    exportdefault{mounted(){constchartDom=this.$refs.chartContainer;// 确保 DOM 存在newChart(chartDom,{type:'bar',data:this.chartData});},data(){return{chartData:{labels:[],datasets:[]}};},created(){axios.get('/api/chart-data').then(response=>{this.chartData=response.data;// 数据在 mounted 前准备好});}};

三、关键注意事项

  1. 避免mounted中的竞态条件

    • 若数据在mounted中请求,DOM 可能因异步延迟未更新。此时操作 DOM 需结合this.$nextTick
      mounted(){this.$nextTick(()=>{constwidth=this.$el.clientWidth;// 确保 DOM 已渲染});}
  2. 服务端渲染(SSR)兼容性

    • mounted仅在客户端执行,SSR 环境下不会触发。若需兼容 SSR,数据请求应放在createdasyncData(Nuxt.js)。
  3. 性能优化

    • 频繁更新的数据(如实时图表)可在created中初始化空数据,在mounted中启动轮询或 WebSocket 连接。
  4. 代码可维护性

    • 将数据请求逻辑封装到methodsactions(Vuex),避免直接在钩子中写复杂逻辑。

四、最佳实践总结

需求类型推荐钩子理由
非 DOM 依赖的数据初始化created尽早获取数据,减少白屏时间,避免模板闪烁。
DOM 依赖的操作或数据请求mounted确保 DOM 存在,避免操作未渲染的元素导致错误。
兼容 SSR 的数据请求createdmounted不在服务端执行,可能引发 hydration 不匹配。
复杂异步流程(如多次请求)组合使用created中发起请求,在mounted中处理 DOM 或后续逻辑,结合watch监听数据变化。

五、示例:完整组件生命周期

exportdefault{data(){return{user:null,chartInstance:null};},created(){// 1. 初始化非 DOM 依赖数据axios.get('/api/user').then(response=>{this.user=response.data;});},mounted(){// 2. 初始化 DOM 依赖操作this.$nextTick(()=>{if(this.user){// 确保数据已加载this.initChart();}});},methods:{initChart(){constdom=this.$refs.chart;this.chartInstance=newChart(dom,{type:'pie',data:this.user.stats});}},beforeDestroy(){// 3. 清理资源if(this.chartInstance){this.chartInstance.destroy();}}};

结论

  • created:适合数据初始化,尤其是非 DOM 依赖的场景,能提升加载速度。
  • mounted:适合 DOM 操作或依赖渲染后状态的逻辑,确保安全性。
  • 组合使用:复杂场景中,两者常配合实现数据与 DOM 的协同初始化。

根据业务需求选择合适的钩子,可显著提升代码的健壮性与用户体验。

http://www.jsqmd.com/news/413452/

相关文章:

  • 2026年降尿酸膳食与药物推荐:乐康泰生物科技风清定康,调理肝肾促代谢的优选方案 - 品牌推荐官
  • 2026年家用微波炉品牌推荐:美的微波炉全系产品解析,覆盖微蒸烤炸多功能场景 - 品牌推荐官
  • 2026年 北京分家析产律师事务所推荐榜:专业家事法与资产分割口碑之选 - 品牌企业推荐师(官方)
  • 固定资产加速折旧DID(2008-2025)
  • 低查重AI写教材工具大比拼,看看哪个最适合你
  • 2026年热门的205走心机/走心机编程如何选畅销厂家采购指南 - 行业平台推荐
  • vue+nodejs+ElementUi的高校跳蚤二手商城系统设计与实现
  • 为什么组件的data必须是一个函数而不是对象?
  • AI教材写作必备!低查重工具让教材生成不再是难题
  • 硬件的 unit 测试与POST 测试
  • 2026年基坑/铁路/京式/锌钢/道路/市政/桥梁护栏厂家推荐:安平县亚奇丝网制品有限公司 - 品牌推荐官
  • 2026年评价高的防爆喷漆房/宁波无尘喷漆房工厂采购指南如何选(实用) - 行业平台推荐
  • 2026年回转大齿圈专业厂家推荐:辉县市腾飞机械制造,烘干/球磨/回转窑大齿圈定制专家 - 品牌推荐官
  • 别错过!AI专著写作攻略,精选工具助你快速完成学术巨著
  • 2026年知名的注塑机/宁波制笔注塑机哪家质量好厂家推荐(实用) - 行业平台推荐
  • 无锡有哪些靠谱的碳硫分析仪认证厂家 - 工业品牌热点
  • 2026年水利闸门厂家实力推荐:新河县前进水工机械厂钢坝/翻板/铸铁/不锈钢闸门全系解决方案 - 品牌推荐官
  • 掌握AI教材编写诀窍,低查重不再是难题,高效产出优质教材!
  • 大模型调用的写法
  • 2026年常州短视频代运营服务推荐榜单:专业拍摄、创意策划与全案营销一站式解决方案 - 品牌企业推荐师(官方)
  • 2026年附近盐雾试验箱口碑,靠谱供应商在此!光伏组件湿演式验箱/淋雨试验箱,盐雾试验箱公司排行榜 - 品牌推荐师
  • 数据库性能瓶颈初步诊断
  • 破解餐饮毛肚供应链痛点:全链路价值重构法如何打造高品效供应体系 - 速递信息
  • 2026年厨师培训权威推荐:济宁市美开乐职业培训学校,厨师技能/职业/高级培训班全覆盖 - 品牌推荐官
  • 讲讲沈阳成人烘焙培训靠谱吗,沈阳新东方技工学校值得选吗 - 工业推荐榜
  • 2026年靠谱的警示封箱胶带/pe封箱胶带源头直供参考哪家便宜 - 行业平台推荐
  • CRM选型避坑指南:5个常见问题及CRM系统推荐 - SaaS软件-点评
  • 河北靠谱的体育场施工服务,选购时要注意什么 - mypinpai
  • 2026微型风扇厂家推荐:嘉兴顺电子科技有限公司,全规格型号直销及定制服务 - 品牌推荐官
  • 西门子雷达液位变送器7ML5423-1CA01-2CG0