vue 生命周期钩子测试小Demo(通俗易懂)

本文通过一个具体示例,详细解析了Vue.js中各个生命周期钩子的触发时机及其应用场景,帮助读者更好地理解和运用Vue生命周期。

记得博主第一次看生命周期钩子官方API时,第一印象是,讲的非常详细、条理清晰,但是博主还是没完全搞懂,于是经过自己的学习之后通俗易懂的总结一下:

首先,先上一张官方生命周期图示,大家可以参考理解
在这里插入图片描述

 
 

博主写了一个小demo,通过这个例子来进行讲解会比较易懂
可以点击测试demo查看效果

helloWorld.vue
<template>
  <div class="hello">
    <ul>
      <li v-for="(user,index) in users" :key="index" @click="user.show = !user.show">
        <h2>{{user.name}}</h2>
        <h3 v-show="user.show">{{user.job}}</h3>
      </li>
    </ul>
  </div>
</template>
<script>
export default {
  name: "HelloWorld",
  data() {
    return {
      users: [
        { name: "saber", job: "sword", show: false },
        { name: "archar", job: "arrow", show: false },
        { name: "saber", job: "sword", show: false },
        { name: "archar", job: "arrow", show: false },
        { name: "saber", job: "sword", show: false },
        { name: "archar", job: "arrow", show: false },
        { name: "saber", job: "sword", show: false },
        { name: "archar", job: "arrow", show: false }
      ]
    };
  },
  beforeCreate () {
    alert("组件实例化之前执行的函数");
  },
  created() {
    alert("组件实例化完毕,但页面还未显示");
  },
  beforeMount () {
    alert("组件挂载前,页面仍未展示,但虚拟DOM已经配置");
  },
  mounted() {
    alert("组件挂载后,此方法执行后页面显示");
  },
  beforeUpdate() {
    alert("组件更新前,页面仍未更新,但虚拟DOM已经配置");
  },
  updated () {
    alert("组件更新,此方法执行后,页面更新");
  },
  beforeDestroy () {
    alert("组件销毁前");
  },
  destroyed() {
    alert("组件销毁")
  },
};
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
.hello{
  width: 100%;
  max-width: 1200px;
  box-sizing: border-box;
  margin: 40px auto;
}
h3 {
  margin: 40px 0 0;
}
ul {
  list-style-type: none;
  display: flex;
  flex-wrap: wrap;
  padding: 0;
}
li {
  flex-grow: 1;
  flex-basis: 200px;
  border: 1px solid black;
  margin:40px ; 
}
</style>

home.vue
<template>
  <div class="home">
    <HelloWorld v-if="destroy" msg="Welcome to Your Vue.js App"/>
    <button @click="del">销毁组件</button>
  </div>
</template>

<script>
// @ is an alias to /src
import HelloWorld from '@/components/HelloWorld.vue'

export default {
  data () {
    return {
      destroy:true
    }
  },
  name: 'home',
  components: {
    HelloWorld
  },
  methods: {
    del:function(){
      this.destroy = false;
    }
  },
}
</script>

App.vue入口中主要写了路由配置,如果还不了解路由配置的同学,可以查看博主之前的博客,有详细讲解
 
 

动图演示

在这里插入图片描述
 
 

每个周期详解(包括每个过程的运行效果图)

注: 运行截图为依次点击确定按钮后依次截的图

 

beforeCreate(组件实例化之前执行的方法)
  • 还没有将当前的vue对象创建出来时可以调用,只是对当前的事件进行配置,还没有识别属性里的东西(比如data里的数据)
  • 在这一般可以做一些过渡、动画加载

ex:
在这里插入图片描述
如上图所示,页面正处于beforeCreate阶段,等待完成

 
 
 
 

created(组件实例化完毕,但页面还未渲染)
  • 这里实例已经出来啦,当前组件已经被创建好,属性也成功绑定,但是DOM在这个方法调用的时候还是没有被渲染出来
  • 这里通常可以用来获取一些数据,比如获取网络接口,将其数据赋值给相应的属性;
  • 这里也可以结束beforeCreate方法中的loading加载事件,准备渲染DOM

注意: 根据上面的生命周期图可以看出,在这个方法后会检查有没有el或者.$mount属性,如果没有,生命周期结束,若有,继续向下检查有没有两种template中的一种(组件或者html),如果有,执行render函数进行渲染(但是此时DOM并不会呈现出来),如果没有,则生命周期结束。

ex:
在这里插入图片描述
如上图所示,页面正处于created阶段
 
 
 
 

beforeMount(组件挂载前,页面仍未渲染,但虚拟DOM已经配置)
  • 开始在虚拟DOM中编译之前template中的内容,当前还是没有将内容渲染到页面上,仍然看不见内容。

ex:
在这里插入图片描述
在此阶段,虚拟DOM已经配置,但页面仍未渲染完成
 
 
 
 

mounted(组件挂载后,此方法执行后页面显示)
  • 开始挂载之前编译的模板,此方法结束后,页面就渲染完成,内容便显示出来啦。
  • 若果有一些东西想在页面显示出来之后进行操作,就可以写在这里,比如说从后台获取数据就可以写在这里

ex:
在这里插入图片描述
当点击确定后,即此方法执行后,页面渲染完成
在这里插入图片描述
 
 
 
 

beforeUpdate(组件更新前,页面仍未更新,但虚拟DOM已经配置)
  • 数据更新时调用,发生在虚拟 DOM 打补丁之前。
  • 这里适合在更新之前访问现有的 DOM,比如手动移除已添加的事件监听器。

ex:
当点击名字更新详情时,处于此阶段,页面仍未更新,页面内容未改变
在这里插入图片描述

 
 
 
 

updated(组件更新,此方法执行后,页面更新)
  • 由于数据更改导致的虚拟 DOM 重新渲染和打补丁,当这个方法被调用时,组件 DOM 已经更新,所以你现在可以执行依赖于 DOM 的操作
  • 在大多数情况下,应该避免在此期间更改状态。如果要相应状态改变,通常最好使用计算属性或 watcher 取而代之,否则容易出错。

ex:
在这里插入图片描述
当点击确定后,即此方法执行后,页面更新
在这里插入图片描述
 
 
 
 

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

ex:
点击销毁组件按钮后
在这里插入图片描述
 
 
 
 

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

ex:
组件销毁后
在这里插入图片描述
到此就结束啦
 

 
以上均为博主在学习中的自我总结,希望能对大家有所帮助,若有问题,请联系博主解决,谢谢

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值