草庐IT

【vue2】vue生命周期的理解

初映CY的前说 2023-11-19 原文

🥳博       主:初映CY的前说(前端领域)

🌞个人信条:想要变成得到,中间还有做到!

🤘本文核心:vue生命周期的介绍、vue生命周期钩子函数详解,vue生命周期的执行顺序


目录

一、生命周期介绍

二、生命周期的构成

1. 生命周期的四个阶段 :

2.八大钩子作用:

1.beforeCreate():

2.created()

3.beforeMont()

4.monted()

5.beforeUpdata()

6.updated()

7.beforeDestroy()

8.destroyed()

三、执行顺序


一、生命周期介绍

概念:

即一个组件从创建到销毁的一个完整的过程

二、生命周期的构成

钩子概念: vue从创建到销毁过程中,会执行的一些回调函数

1. 生命周期的四个阶段 :

  •  初始化阶段:  beforeCreate、 created
  •  挂载阶段 : beforeMount、mounted
  •  更新阶段 : beforeUpdate、updated
  •  销毁阶段:  beforeDestroy、destroyed
执行顺序钩子函数执行时机
1beforeCreate(){}

vue实例创建了,但是el和data还没有创建 (准备创建data)

底层(初始化vue实例,初始化钩子函数,初始化一些事件和侦听器配置项)

2created() {}

data数据创建了,但是el挂载点还没有创建 (准备创建el)

底层:初始化data中的数据和methods中的方法

3beforeMount() {}

el挂载点创建了,但是data数据还没有渲染(准备渲染中)

底层:创建el挂载点,并且生成虚拟DOM

4mounted() {}

data数据 第一次 渲染完毕 (完成初始渲染)

底层:将虚拟dom渲染成真实DOM

5beforeUpdate() {}检测到data数据变化,但是还没有开始重新渲染 (data变了,准备重新渲染中) 会执行多次
6updated() {}变化后的data数据 ,完成渲染到页面 (完成重新渲染,会重复执行
7beforeDestroy() {}

vue实例销毁即将销毁(解除data与el的关联),之后修改data,页面不会被渲染

底层 : 解除 事件绑定、侦听器、组件

8destroyed() {}

vue实例已经销毁

2.八大钩子作用:

[前置准备]先创建一个空的vue文件,写入我们需要的素材

<template>
  <div>
    <button @click=" name='李四' ">点我改名字</button>
    <button @click="$destroy()">点我销毁</button>
    <p>{{ name }}</p>
    <p>{{ age }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      name: "张三",
      age: 20
    };
  }
};
</script>

<style>
</style>

上述页面浏览效果如下:


1.beforeCreate():

  • vue实例创建了,但是el和data还没有创建 (准备创建data)
  • 底层(初始化vue实例,初始化钩子函数,初始化一些事件和侦听器配置项)
/* 生命周期钩子 */
// 1. beforeCreate() :  创建了vue实例,但是还没有创建data  
beforeCreate() {
    console.log(1);
    console.log(this);
    console.log(this.name);
  }

写入beforeCreate页面效果查看:

我们是生成了初始的vue实例,但是我们存放在data中的数据没有取到

2.created()

  • 创建初始了data,但是还没有挂载
  • 经典应用 : 页面一加载, ajax请求数据渲染页面。一般写在这个钩子里面
  // 2.created() : 创建了data,但是还没有挂载
  /* 常用: 最早可以获取data的钩子, 一般在这个钩子发送ajax */
  created() {
    console.log(2);
    console.log(this);
    console.log(this.name);
    console.log(this.$el);
  }

写入created页面效果查看:

此时我们存放在data中的数据被找到了 ,但是我们的挂载点没有被找到

3.beforeMont()

  • 创建挂载点,但是还没有把data挂载到el
// 3.beforeMount() : 创建挂载点,但是还没有把data挂载到el
  beforeMount() {
    console.log(3);
    console.log(this);
    // html环境,这个钩子$el可以获取挂载点。  脚手架环境, 这个钩子$el获取的是undefined
    console.log(this.$el);
    const p = document.querySelector("p");
    console.log(p); //null 没有渲染,所以无法获取dom
  }

 写入beforeMont页面效果查看:

这一步是生成创建我们的挂载点 

4.monted()

  • 完成初始渲染。 把data数据渲染到挂载点el
  • 经典应用 : 一般常用于操作dom(页面一家在需要操作DOM在这个钩子上)
  mounted() {
    console.log(4);
    console.log(this);
    console.log(this.$el);
    const p = document.querySelector("p");
    console.log(p); // p标签 完成渲染
  }

  写入monted页面效果查看:

我们的挂载点创建成功,讲我们data中的数据存放进去并渲染成功啦!


经历了上述的四个阶段的操作现在我们完成了组件data中的被数据获取到页面渲染的整个流程,接下来的钩子是用于修改data数据与销毁我们的vue实例

5.beforeUpdata()

  •  检测到data数据发生变化,但是还没有更新el
  • 检测data数据变化, 修改虚拟DOM
  • 当有data数据改变 – 重复这个循环( beforeUpdata()与updated() )

 写入beforeUpdata页面效果查看:

 第一步:先在我们的vue中打一个debuddgr断点,防止我们走到updataed的位置

  beforeUpdate() {
    console.log(5);
    console.log(this);// 获取的是变化后的数据, 但是页面还是显示之前的数据
    debugger
  }

第二步:我们现在在vuetools中修改data中的数据,当修改数据后面不变化!当我确定的时候会依旧变成张三。但是我们的内存中会显示出我们修改过的内容

 可以看到我们的vue实例对象中的name被我们成功的修改了,但是大家看右上角的张三,并没有被我们修成。

【再次验证】这是我们直接修改data中的数据,当我们点击 “点我改名字”这个按钮的时候也会出现

之后我们卡在这里了,当我们点击箭头的时候,我们的vue就更新了 

6.updated()

  • 更新之后的data,完成渲染
  • 完成data渲染(将虚拟DOM渲染成真实DOM)
  // 6.updated(): 更新之后的data,完成渲染
  updated() {
    console.log(6);
    console.log(this);
  }

 写入updated页面效果查看:

显而易见当我们修改之后我们的数据马上就渲染到页面上了。实现了彻底更新的操作

7.beforeDestroy()

  •  正在销毁(接触data与el绑定、移除事件监听、移除侦听器)
      触发销毁钩子的两个条件 
      (1)对组件使用v-if
      (2)调用组件的 this.$destroy() 

 写入beforeDestroy页面效果查看:

我们的vue实例正在被销毁

8.destroyed()

  • 完成销毁
    //8.destroyed(): 完成销毁
    destroyed() {
    console.log(8);
    console.log(this);
  }

   写入destroy页面效果查看:

至此我们的vue实例对象从出生创建到销毁喽

上述操作的源代码见下:

App.vue

<template>
  <div>
    <button @click="name = '李四'">点我改名字</button>
    <button @click="$destroy()">点我销毁</button>
    <p>{{ name }}</p>
    <p>{{ age }}</p>


  </div>
</template>
<script>
export default {
  data() {
    return {
      name: '张三',
      age: 20,
    }
  },

  /* 生命周期钩子 */
  // 1. beforeCreate() :  创建了vue实例,但是还没有创建data
  beforeCreate() {
    console.log(1)
    console.log(this)
    console.log(this.name)
  },
  // 2.created() : 创建了data,但是还没有挂载
  /* 常用: 最早可以获取data的钩子, 一般在这个钩子发送ajax */
  created() {
    console.log(2)
    console.log(this)
    console.log(this.name)
    console.log(this.$el)
  },
  // 3.beforeMount() : 创建挂载点,但是还没有把data挂载到el
  beforeMount() {
    console.log(3)
    console.log(this)
    // html环境,这个钩子$el可以获取挂载点。  脚手架环境, 这个钩子$el获取的是undefined
    console.log(this.$el)
    const p = document.querySelector('p')
    console.log(p) //null 没有渲染,所以无法获取dom')
  },
  // 4.mounted() : 完成初始渲染。 把data数据渲染到挂载点el
  /* 常用: 最早可以操作DOM的钩子 */
  mounted() {
    console.log(4)
    console.log(this)
    console.log(this.$el)
    const p = document.querySelector('p')
    console.log(p) // p标签 完成渲染
  },
  // 5.beforeUpdate() : 检测到data数据发生变化,但是还没有更新el
  beforeUpdate() {
    console.log(5)
    console.log(this) // 获取的是变化后的数据, 但是页面还是显示之前的数据
    // eslint-disable-next-line no-debugger
    debugger
  },
  // 6.updated(): 更新之后的data,完成渲染
  updated() {
    console.log(6)
    console.log(this)
  },
  // 7.beforeDestroy(): 正在销毁(接触data与el绑定、移除事件监听、移除侦听器)
  /*触发销毁钩子的两个条件 
  (1)对组件使用v-if
  (2)调用组件的 this.$destroy() 
  */
  beforeDestroy() {
    console.log(7)
    console.log(this)
    // eslint-disable-next-line no-debugger
  },
  //8.destroyed(): 完成销毁
  destroyed() {
    console.log(8)
    console.log(this)
  },
}
</script>

<style>
</style>

三、执行顺序

即按照我们介绍钩子函数的顺序依次往下执行

App.vue

<template>
  <div>
    <!-- 导入子组件 -->
    <son></son>
  </div>
</template>
<script>

import son from '@/components/son.vue'
export default {
  components: { son },


  /* 生命周期钩子 */
  // 1. beforeCreate() :  创建了vue实例,但是还没有创建data
  beforeCreate() {
    console.log('父的beforeCreate')
  },
  // 2.created() : 创建了data,但是还没有挂载
  /* 常用: 最早可以获取data的钩子, 一般在这个钩子发送ajax */
  created() {
    console.log('父的Created')
  },
  // 3.beforeMount() : 创建挂载点,但是还没有把data挂载到el
  beforeMount() {
    console.log('父的beforeMount')
  },
  // 4.mounted() : 完成初始渲染。 把data数据渲染到挂载点el
  /* 常用: 最早可以操作DOM的钩子 */
  mounted() {
    console.log('父的Mounted')
  },
}
</script>

<style>
</style>

 son.vue

<!-- eslint-disable vue/multi-word-component-names -->
<template>
  <div>
  </div>
</template>

<script>
export default {

  beforeCreate() {
    console.log('子的beforeCreate')
  },
  // 2.created() : 创建了data,但是还没有挂载
  /* 常用: 最早可以获取data的钩子, 一般在这个钩子发送ajax */
  created() {
    console.log('子的Created')
  },
  // 3.beforeMount() : 创建挂载点,但是还没有把data挂载到el
  beforeMount() {
    // html环境,这个钩子$el可以获取挂载点。  脚手架环境, 这个钩子$el获取的是undefined
    console.log('子的beforeMount')
  },
  // 4.mounted() : 完成初始渲染。 把data数据渲染到挂载点el
  /* 常用: 最早可以操作DOM的钩子 */
  mounted() {
    console.log('子的Mounted')
  },

}
</script>

<style>

</style>

 我们跑一下看下执行效果:

 发现是我们父元素先执行到beforeMont,随后等子渲染完成(执行子的mounted)最后将父的mounted执行完成,完成我们最终的渲染。虽然是有包含关系,但是执行流程是不变的。

有关【vue2】vue生命周期的理解的更多相关文章

  1. ruby-on-rails - ruby 日期方程不返回预期的真值 - 2

    为什么以下不同?Time.now.end_of_day==Time.now.end_of_day-0.days#falseTime.now.end_of_day.to_s==Time.now.end_of_day-0.days.to_s#true 最佳答案 因为纳秒数不同:ruby-1.9.2-p180:014>(Time.now.end_of_day-0.days).nsec=>999999000ruby-1.9.2-p180:015>Time.now.end_of_day.nsec=>999999998

  2. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  3. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  4. TimeSformer:抛弃CNN的Transformer视频理解框架 - 2

    Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图

  5. ruby - 易于初学者理解的 Ruby 库 - 2

    关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。关闭3年前。Improvethisquestion我正处于学习Ruby的阶段,我想查看一些小型库的源代码以了解它们是如何构建的。我不知道什么是小型图书馆,但希望SO能推荐一些易于理解的图书馆来学习。因此,如果有人知道一两个非常小的库,这是新手Rubyists学习的好例子,请推荐!我想使用Manveru'sInnatelib,因为它试图保持在2000LOC以下,但我还不熟悉其中经常使用的Ruby速记。也许大约100-5

  6. ruby - 无法理解 `puts{}.class` 和 `puts({}.class)` 之间的区别 - 2

    由于匿名block和散列block看起来大致相同。我正在玩它。我做了一些严肃的观察,如下所示:{}.class#=>Hash好的,这很酷。空block被视为Hash。print{}.class#=>NilClassputs{}.class#=>NilClass为什么上面的代码和NilClass一样,下面的代码又显示了Hash?puts({}.class)#Hash#=>nilprint({}.class)#Hash=>nil谁能帮我理解上面发生了什么?我完全不同意@Lindydancer的观点你如何解释下面几行:print{}.class#NilClassprint[].class#A

  7. ruby - 如何理解 Ruby 中的发送者和接收者? - 2

    我很难理解Ruby中sender和receiver的实际含义。它们一般是什么意思?到目前为止,我只是将它们理解为方法调用和获取其返回值的调用。但是,我知道我的理解还远远不够。谁能给我一个Ruby中发送者和接收者的具体解释? 最佳答案 面向对象中的一个核心概念是消息传递和早期概念化,这在很大程度上借鉴了计算的Actor模型。艾伦·凯(AlanKay)创造了面向对象一词并发明了最早的OO语言之一SmallTalk,他拥有voicedregretatusingatermwhichputthefocusonobjectsinsteadofo

  8. ruby-on-rails - Rails - 理解 application.js 和 application.css - 2

    rails新手。只是想了解\assests目录中的这两个文件。例如,application.js文件有如下行://=requirejquery//=requirejquery_ujs//=require_tree.我理解require_tree。只是将所有JS文件添加到当前目录中。根据上下文,我可以看出requirejquery添加了jQuery库。但是它从哪里得到这些jQuery库呢?我没有在我的Assets文件夹中看到任何jquery.js文件——或者直接在我的整个应用程序中没有看到任何jquery.js文件?同样,我正在按照一些说明安装TwitterBootstrap(http:

  9. (附源码)vue3.0+.NET6实现聊天室(实时聊天SignalR) - 2

    参考文章搭建文章gitte源码在线体验可以注册两个号来测试演示图:一.整体介绍  介绍SignalR一种通讯模型Hub(中心模型,或者叫集线器模型),调用这个模型写好的方法,去发送消息。  内容有:    ①:Hub模型的方法介绍    ②:服务器端代码介绍    ③:前端vue3安装并调用后端方法    ④:聊天室样例整体流程:1、进入网站->调用连接SignalR的方法2、与好友发送消息->调用SignalR的自定义方法 前端通过,signalR内置方法.invoke()  去请求接口3、监听接受方法(渲染消息)通过new signalR.HubConnectionBuilder().on

  10. ruby - 你如何理解 Ruby 中的这个三元条件? - 2

    我在某些代码中遇到了三元组,但我无法理解条件:str.split(/',\s*'/).mapdo|match|match[0]==?,?match:"somestring"end.join我确实理解我是在某些点上拆分字符串并将总结果转换为数组,然后依次处理数组的每个元素。除此之外,我不知道发生了什么。 最佳答案 一种(稍微)不那么令人困惑的写法是:str.split(/',\s*'/).mapdo|match|ifmatch[0]==?,matchelse"somestring"endend.join我认为多行三元语句很糟糕,尤其是

随机推荐