vue生命周期钩子函数的正确使用方式

vue生命周期钩子函数的正确使用方式对于 vue 生命周期我们还是要先了解清楚 因为不同的生命期用不同的钩子函数 先上图 遇到的一个问题在我的项目中 常用的生命周期钩子函数一直都是 mounted 对于大部分情况 都是屡试不爽 捷报频传 但是在前几天却遭遇了一个意外 我在 mounted 中获取后台数据并更新 data 在 template 中把 data fullname 与一个 p 元素的 innerHTML 绑定 这是一个简单到不能再简单 普通到不

对于vue生命周期我们还是要先了解清楚,因为不同的生命期用不同的钩子函数,先上图:在这里插入图片描述
遇到的一个问题
在我的项目中,常用的生命周期钩子函数一直都是mounted,对于大部分情况,都是屡试不爽、捷报频传~




但是在前几天却遭遇了一个意外,我在mounted中获取后台数据并更新data,在template中把data.fullname与一个p元素的innerHTML绑定,这是一个简单到不能再简单,普通到不能更普通的操作,打开浏览器一看,完美!fullname的数据正常显示在p元素中,没有任何问题,可是……咦,控制台怎么报错了?

报错信息
报错信息的大致意思是,data是null,无法获取到null的fullname属性,可是数据明明正常显示了呀,而且我们不是从后台请求数据并给data赋值了嘛?

经过一番排查,发现原因有两处:

1.List item

初始化时,给data的值是null

 data () { return { data: null, }, 

vue渲染template的时间在beforeMount之后,mounted之前,所以渲染template时data值为null,故而报错;但是待后台数据请求成功给data赋值后,p元素能监听到数据的变化,然后更新其innerHTML,所以UI看起来是很正常的

后来经过验证,上述的解决方案是错误的,因为它只针对同步代码有效果。而ajax请求是异步操作,回调函数的执行时间不能确定,所以即使放在created钩子函数中,也不能保证在mounted之前完成数据的请求……

所以最终的解决方案是,给p标签加一个v-if,待data不为null时再进行渲染,但并不算很优雅。

不知道vue的生命周期钩子函数是否支持promise或者async/await,如果大神们有更好的解决方案,欢迎交流~

总结

1 一点小小的感悟,vue生命周期钩子函数的使用并非一成不变的,要根据不同的应用场景而有所改变,稍微总结一下:

这个时候的vue实例还什么都没有,但是$route对象是存在的,可以根据路由信息进行重定向之类的操作。

3 created:在实例已经创建完成之后被调用。在这一步,实例已完成以下配置:数据观测(data observer) ,属性和方法的运算,

4 watch/event 事件回调。然而,挂载阶段还没开始, e l 属 性 目 前 不 可 见 。 此 时 t h i s . el属性目前不可见。 此时 this. elthis.data 可以访问,watcher、events、methods也出现了,若根据后台接口动态改变data和methods的场景下,可以使用。

使用场景我上文已经提到了,页面渲染时所需要的数据,应尽量在这之前完成赋值。 mounted:在挂载之后被调用。在这一步 创建vm. e l 并 替 换 e l , 并 挂 载 到 实 例 上 。 ( 官 方 文 档 中 的 , “ 如 果 r o o t 实 例 挂 载 了 一 个 文 档 内 元 素 , 当 m o u n t e d 被 调 用 时 v m . el并替换el,并挂载到实例上。(官方文档中的, “如果root实例挂载了一个文档内元素,当mounted被调用时vm. elel,rootmountedvm.el也在文档内” 这句话存疑)此时元素已经渲染完成了,依赖于DOM的代码就放在这里吧~比如监听DOM事件。

6.beforeUpdate: v m . d a t a 更 新 之 后 , 虚 拟 D O M 重 新 渲 染 和 打 补 丁 之 前 被 调 用 。 你 可 以 在 这 个 钩 子 中 进 一 步 地 修 改 vm.data更新之后,虚拟DOM重新渲染 和打补丁之前被调用。 你可以在这个钩子中进一步地修改 vm.dataDOMvm.data,这不会触发附加的重渲染过程。 updated:虚拟DOM重新渲染 和打补丁之后被调用。

当这个钩子被调用时,组件DOM的data已经更新,所以你现在可以执行依赖于DOM的操作。但是不要在此时修改data,否则会继续触发beforeUpdate、updated这两个生命周期,进入死循环!

7 .beforeDestroy:实例被销毁之前调用。在这一步,实例仍然完全可用。 实例要被销毁了,赶在被销毁之前搞点事情吧哈哈~

8.destroyed:Vue实例销毁后调用。此时,Vue实例指示的所有东西已经解绑定,所有的事件监听器都已经被移除,所有的子实例也已经被销毁。

这时候能做的事情已经不多了,只能加点儿提示toast之类的东西吧。

注:beforeMount、mounted、beforeUpdate、updated、beforeDestroy、destroyed这几个钩子函数,在服务器端渲染期间不被调用。

引用:https://www.jianshu.com/p/a20f2023c78a

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/214187.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午4:47
下一篇 2026年3月18日 下午4:48


相关推荐

  • coze工作创建完毕怎么保存

    coze工作创建完毕怎么保存

    2026年3月12日
    2
  • mysql解锁命令_mysql锁表查询和解锁操作

    mysql解锁命令_mysql锁表查询和解锁操作解除正在死锁的状态有两种方法:第一种:1.查询是否锁表showOPENTABLESwhereIn_use>0;2.查询进程(如果您有SUPER权限,您可以看到所有线程。否则,您只能看到您自己的线程)showprocesslist3.杀死进程id(就是上面命令的id列)killid第二种:1.查看下在锁的事务SELECT*FROMINFORMATION_SCHEMA.IN…

    2022年5月22日
    296
  • 新手入侵笔记_探灵笔记适合新手的角色

    新手入侵笔记_探灵笔记适合新手的角色【拿shell】 1.直接上传aspasajspcerphpaspxhtrcdx格式的木马,不行就利用IIS6.0解析漏洞”:1.asp;1.jpg/1.asp;.jpg/1.asp;jpg/1.asp;.xls 2.上传图片木马遇到拦截系统,连图片木马都上传不了,记事本打开图片木马在代码最前面加上gif89a,一般就能逃过拦截系统了。 3.上传图片木马把地址复制到…

    2026年2月10日
    6
  • mysql数据库置疑,sqlserver2000数据库置疑的解决方法

    mysql数据库置疑,sqlserver2000数据库置疑的解决方法搜索热词先分离数据库企业管理器右键 suspect 的数据库所有任务分离数据库然后备份你的 suspect 数据库的文件 再按下面的步骤处理 1 新建一个同名的数据库 2 再停掉 sqlserver3 用 suspect 数据库的文件覆盖掉这个新建的同名数据库 4 再重启 sqlserver5 此时打开企业管理器时新建的同名数据库会出现置疑 先不管 执行下面的语句 注意修改其中的数据库名 USEMA

    2026年3月20日
    2
  • 入门理解H264编码

    入门理解H264编码nbsp nbsp nbsp nbsp nbsp 最近入门音视频技术 一直在学习 H264 编解码标准 了解了不少关于 H264 的相关知识 对于网上各种类型的资料 始终没有找到一篇适合的知识梳理资料 可能是查找方式不对 所以花费了比较多的时间 经过一段时间的熟悉后结合网上各类大神的指导资料决定自己整理一下关于 H264 编解码标准的知识 以后方便自己查阅 也让更多刚入门的人提供一个参考资料 由于是新人 所以有些地方可能有理解不全面 望各位前

    2026年3月20日
    2
  • pycharm激活码2021最新破解方法

    pycharm激活码2021最新破解方法,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月15日
    60

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号