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才有效

相关推荐
程序员_三木15 分钟前
Three.js入门-Raycaster鼠标拾取详解与应用
开发语言·javascript·计算机外设·webgl·three.js
顾平安1 小时前
Promise/A+ 规范 - 中文版本
前端
聚名网1 小时前
域名和服务器是什么?域名和服务器是什么关系?
服务器·前端
桃园码工1 小时前
4-Gin HTML 模板渲染 --[Gin 框架入门精讲与实战案例]
前端·html·gin·模板渲染
沈剑心1 小时前
如何在鸿蒙系统上实现「沉浸式」页面?
前端·harmonyos
一棵开花的树,枝芽无限靠近你2 小时前
【PPTist】组件结构设计、主题切换
前端·笔记·学习·编辑器
m0_748237052 小时前
Chrome 关闭自动添加https
前端·chrome
prall2 小时前
实战小技巧:下划线转驼峰篇
前端·typescript
开心工作室_kaic2 小时前
springboot476基于vue篮球联盟管理系统(论文+源码)_kaic
前端·javascript·vue.js
川石教育2 小时前
Vue前端开发-缓存优化
前端·javascript·vue.js·缓存·前端框架·vue·数据缓存