Vue生命周期钩子

文章目录

引出

  1. 又名:生命周期回调函数、生命周期函数、生命周期钩子
  2. 是什么:Vue在关键时刻帮我们调用的一些特殊名称的函数
  3. 生命周期函数的名字不可更改,但函数的具体内容是程序员根据需求编写的
  4. 生命周期函数中的this指向是vm 或 组件实例对象
  5. 使用mounted()过渡效果
    实现内容自动淡入淡出效果
html 复制代码
<body>
  <div id="root">
    <h2 :style="{opacity}">欢迎学习Vue</h2>
  </div>

</body>
<script type="text/javascript">
  Vue.config.productionTip = false;

  new Vue({
    el: '#root',
    data:{
      opacity: 1
    },
    // Vue完成模版的解析并把初始的真实DOM元素放入页面后(挂载完毕)调用mounted
    mounted(){
      setInterval(()=>{
        this.opacity -= 0.01
        if(this.opacity <= 0) this.opacity = 1
      }, 16)
    }
  })
</script>

分析

vm的生命周期

将要创建 ===> 调用beforeCreate函数

在实例初始化之后,进行数据侦听和事件/侦听器的配置之前同步调用
创建完毕 ===> 调用created函数

在实例创建完成后被立即同步调用

  1. 在这一步中,实例已经对选项的处理,意味着一下内容已被配置完成:数据侦听、计算属性、方法、事件/侦听器的回调函数
  2. 然而挂载阶段还没开始,且$el property目前尚不可用
    将要挂载 ===> 调用beforeMount函数
    在挂载开始之前被调用:相关的render函数首次被调用,该钩子在服务器端渲染期间不被调用
    挂载完毕 ===> mounted ========>【重要的钩子】
  3. 实例被挂载后调用,这时el被新创建的vm.$el替换了
  4. 如果根实例挂载到了一个文档内的元素上,当mounted被调用时vm.$el也在文档内
  5. 注意mounted不会保证所有的子组件也都被挂载完成
    将要更新 ===> beforeUpdate
    在数据发生改变后,DOM 被更新之前被调用。
  6. 这里适合在现有 DOM 将要被更新之前访问它,比如移除手动添加的事件监听器。
  7. 该钩子在服务器端渲染期间不被调用,因为只有初次渲染会在服务器端进行。
    更新完毕 ===> updated
    在数据更改导致的虚拟 DOM 重新渲染和更新完毕之后被调用。
  8. 当这个钩子被调用时,组件 DOM 已经更新,所以你现在可以执行依赖于 DOM 的操作。
  9. 然而在大多数情况下,你应该避免在此期间更改状态。如果要相应状态改变,通常最好使用 计算属性 或 watcher 取而代之。
    将要销毁 ===> beforeDestroy =====>【重要的钩子】
    实例销毁之前调用。在这一步,实例仍然完全可用。该钩子在服务器端渲染期间不被调用。
    销毁完毕 ===> destroyed
    实例销毁后调用。该钩子被调用后,对应 Vue 实例的所有指令都被解绑,所有的事件监听器被移除,所有的子实例也都被销毁。该钩子在服务器端渲染期间不被调用。
html 复制代码
<body>
  <div id="root">
    <h2 v-text="n"></h2>
    <h2>当前n值是:{{n}}</h2>
    <button @click="add">点我n+1</button>
    <button @click="bye">点我销毁vm</button>
  </div>

</body>
<script type="text/javascript">
  Vue.config.productionTip = false;

  new Vue({
    el: '#root',
    data: {
      n: 1
    },
    // Vue完成模版的解析并把初始的真实DOM元素放入页面后(挂载完毕)调用mounted
    methods: {
      add() {
        console.log('add')
        this.n++
      },
      bye() {
        console.log('bye');
        this.$destroy()
      }
    },
    watch:{
      n(){
        console.log('n被修改了')
      }
    },
    beforeCreate() {
      console.log('beforeCreate')
    },
    created() {
      console.log('created')
    },

    beforeMount() {
      console.log('beforeMount')
    },
    mounted() {
      console.log('mounted')
    },
    updated() {
      console.log('updated')
    },
  })
</script>

常用的生命周期钩子:

  1. mounted:发送ajax请求、启动定时器、绑定自定义事件、订阅消息等【初始化操作】
  2. beforeDestroy:清除定时器、解绑自定义事件、取消订阅消息等【收尾工作】

关于销毁Vue实例

  1. 销毁后借助Vue开发者工具看不到任何信息
  2. 销毁后自定义事件会失效,但原生DOM事件依然有效
  3. 一般不会再beforeDestroy操作数据,因为即使操作数据,也不会再触发更新流程了

三个上图中未呈现的钩子

nextTick

  1. 语法: this.$nextTick(回调函数)
  2. 作用:在下一次DOM更新结束后执行其指定的回调
  3. 什么时候用:当改变数据后,要基于更新后的新DOM进行某些操作时,要在nextTick所指定的回调函数中执行

路由组件所独有的声明周期钩子

  1. 作用:路由组价所独有的两个钩子,用于捕获路由组件的激活状态
  2. 具体名字
    a. activated路由组件被激活时触发
    b. deactivated路由组件失活时触发
javascript 复制代码
activated() {
  console.log("News组件被激活了");
  this.timer = setInterval(() => {
    console.log("@");
    this.opacity -= 0.1;
    if (this.opacity <= 0) {
      this.opacity = 1;
    }
  }, 500);
},
  deactivated() {
    console.log("News组件失活了");
    clearInterval(this.timer);
  },

注:需要搭配keep-alive才有效

相关推荐
逐·風3 小时前
unity关于自定义渲染、内存管理、性能调优、复杂物理模拟、并行计算以及插件开发
前端·unity·c#
Devil枫3 小时前
Vue 3 单元测试与E2E测试
前端·vue.js·单元测试
尚梦4 小时前
uni-app 封装刘海状态栏(适用小程序, h5, 头条小程序)
前端·小程序·uni-app
GIS程序媛—椰子4 小时前
【Vue 全家桶】6、vue-router 路由(更新中)
前端·vue.js
前端青山5 小时前
Node.js-增强 API 安全性和性能优化
开发语言·前端·javascript·性能优化·前端框架·node.js
毕业设计制作和分享5 小时前
ssm《数据库系统原理》课程平台的设计与实现+vue
前端·数据库·vue.js·oracle·mybatis
程序媛小果5 小时前
基于java+SpringBoot+Vue的旅游管理系统设计与实现
java·vue.js·spring boot
从兄6 小时前
vue 使用docx-preview 预览替换文档内的特定变量
javascript·vue.js·ecmascript
凉辰7 小时前
设计模式 策略模式 场景Vue (技术提升)
vue.js·设计模式·策略模式
清灵xmf7 小时前
在 Vue 中实现与优化轮询技术
前端·javascript·vue·轮询