先上图

vue的生命周期

遇到的一个问题

在我的项目中,常用的生命周期钩子函数一直都是mounted,对于大部分情况,都是屡试不爽、捷报频传~

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

报错信息

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

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

初始化时,给data的值是null

data () {

return {

data: null,

},

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

解决方案

所以解决方案是非常简单的,只需要保证渲染template的时候,data已经拿到后台数据就可以了,所以可以把mounted钩子函数修改为beforeMount,或者其他更早被调用的钩子函数:beforeCreated、created等

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

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

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

总结

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

beforeCreate:在实例初始化之后,**数据观测(data observer) ** 和 event/watcher事件配置 之前被调用,注意是 之前,此时data、watcher、methods统统滴没有。

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

created:在实例已经创建完成之后被调用。在这一步,实例已完成以下配置:数据观测(data observer) ,属性和方法的运算, watch/event 事件回调。然而,挂载阶段还没开始,$el属性目前不可见。

此时 this.$data 可以访问,watcher、events、methods也出现了,若根据后台接口动态改变data和methods的场景下,可以使用。

beforeMount:在挂载开始之前被调用,相关的 render 函数 首次被调用。但是render正在执行中,此时DOM还是无法操作的。我打印了此时的vue实例对象,相比于created生命周期,此时只是多了一个$el的属性,然而其值为undefined。

使用场景我上文已经提到了,页面渲染时所需要的数据,应尽量在这之前完成赋值。

mounted:在挂载之后被调用。在这一步 创建vm.$el并替换el,并挂载到实例上。(官方文档中的 “如果root实例挂载了一个文档内元素,当mounted被调用时vm.$el也在文档内” 这句话存疑)

此时元素已经渲染完成了,依赖于DOM的代码就放在这里吧~比如监听DOM事件。

beforeUpdate:$vm.data更新之后,虚拟DOM重新渲染 和打补丁之前被调用。

你可以在这个钩子中进一步地修改$vm.data,这不会触发附加的重渲染过程。

updated:虚拟DOM重新渲染 和打补丁之后被调用。

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

beforeDestroy:实例被销毁之前调用。在这一步,实例仍然完全可用。

实例要被销毁了,赶在被销毁之前搞点事情吧哈哈~

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

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

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

mounted钩子函数_vue生命周期钩子函数的正确使用方式相关推荐

  1. Vue 钩子函数(含生命周期钩子)汇总

    Vue 实例从创建到销毁的过程,就是生命周期.也就是从开始创建.初始化数据.编译模板.挂载 Dom→渲染.更新→渲染.卸载等一系列过程,我们称这是 Vue 的生命周期. 一. beforeCreate ...

  2. actived生命周期_vue生命周期钩子函数actived没有执行

    调用actived钩子函数,发现代码没有执行.......为何vue 背景技术选型:vue+vue-router+vuex 第一步:路由配置文件设置keepAlive=truevue-router / ...

  3. 史上最全的Vue生命周期钩子函数11个

    什么是生命周期? 生命周期: Vue是一个构造函数,当执行执行这个函数时,相当于初始化vue实例: 在创建实例过程中,需要设置数据监听,编译模板,将实例挂载到DOM上,数据更新能够让DOM也更新,在这 ...

  4. Vue3 Composition API(三)——生命周期钩子、Provide函数 和 Inject函数、封装Hook案例、setup顶层编写方式

    一.生命周期钩子 我们前面说过 setup 可以用来替代 data . methods . computed .watch 等等这些选项,也可以替代 生命周期钩子. 那么setup中如何使用生命周期函 ...

  5. Vue.js 系列教程 3:Vue-cli,生命周期钩子

    原文:intro-to-vue-3-vue-cli-lifecycle-hooks 译者:nzbin 这是 JavaScript 框架 Vue.js 五篇教程的第三部分.在这一部分,我们将学习 Vue ...

  6. Vue生命周期钩子剖析(共12个钩子)

    生命周期示意图: 生命周期及其钩子函数理解 生命周期: Vue是一个构造函数,当执行执行这个函数时,相当于初始化vue实例:在创建实例过程中,需要设置数据监听,编译模板,将实例挂载到DOM上,数据更新 ...

  7. -Vue生命周期钩子

    1.1-Vue生命周期钩子介绍 vue生命周期钩子官方文档: 官方文档图解介绍:生命周期图示 官方文档详细介绍:vue生命周期钩子介绍 ==vue生命周期钩子介绍 : vue从创建到销毁过程中,会执行 ...

  8. React生命周期函数-生命周期回调函数

    面试的时候问到了如何运用,这里再回顾一下. 也叫生命周期钩子函数(生命周期钩子) 生命周期大概分成三个阶段:初始化阶段,更新阶段,卸载 将组件放入页面的过程中,React会在合适的时间进行函数的调用. ...

  9. Vue多组件切换,并相互传值(在created和mounted生命周期钩子函数中渲染数据的区别)

    <!DOCTYPE html> <html><head><meta charset="utf-8"><title>< ...

最新文章

  1. linux进程间通信:POSIX 消息队列
  2. Linux数据库性能优化--文件系统相关优化
  3. 谷歌提出纯 MLP 构成的视觉架构,无需卷积、注意力 !
  4. 人工智能的2020:泡沫破灭?还是最后的狂欢?
  5. python跳出if条件_python的if条件判断
  6. WebService开发笔记 1 -- 利用cxf开发WebService竟然如此简单
  7. 关于ActionBar的向下兼容
  8. 读Google是如何做测试的
  9. 【转】 最新版chrome谷歌浏览器Ajax跨域调试问题
  10. TensorFlow 笔记3--模型的保存与恢复
  11. java jks 转pfx_JKS和PFX文件相互转换方法
  12. 分享一个引起极度舒适的工作桌面
  13. [Spring+SpringMVC+Mybatis]框架学习笔记(四):Spring实现AOP
  14. win10和win7游戏测试软件,Win10系统和Win7玩游戏哪个更快?评测在这里!
  15. 通过GPUImage实现40+种滤镜与实时美颜功能
  16. js实现身份证验证功能
  17. 匿名通信攻击技术:主动攻击、被动攻击、单端攻击、端到端攻击
  18. 植被抽稀lisp程序_地形图缩编中植被符号抽稀方法.doc
  19. 360测绘云Quake网络空间测绘系统双领域上榜“安全牛”
  20. 计算机毕业设计Javahtml5健身房信息管理系统(源码+系统+mysql数据库+lw文档)

热门文章

  1. php禁止直接访问源码,php禁止直接从浏览器输入地址访问.PHP文件-PHP源码
  2. 辽宁省本溪市谷歌高清卫星地图下载
  3. SQL yog解除30天试用限制
  4. Rasa课程、Rasa培训、Rasa面试系列之 Rasa Version 3.x Responses在对话中使用响应
  5. 微信聊天记录异常怎么修复?经验分享!微信聊天记录如何进行修复?
  6. Linux驱动模块编译报错 ‘init_module‘ specifies less restrictive attribute than its target
  7. 某查查 sign和token研究
  8. Radware Linkproof版本升级
  9. css实现一行文字居中,多行文字左对齐
  10. 我的23寸AOC显示器和一台8G经济实惠组装台式机