当前位置: 首页 > news >正文

一文带你读懂Vue生命周期

Vue生命周期

vue生命周期(又称生命周期回调函数、生命周期函数、生命周期钩子),指的是vue在关键时刻帮我们调用一些特殊名称的函数。

vue生命周期涵盖从vue实例创建虚拟dom产生再到数据绑定、数据监听、数据渲染以及销毁的整个过程:

Vue实例初始化阶段

1、beforCreate 实例初始化之前,完成一些事件和默认生命周期,此时还不可以访问data中的数据和methods中的方法

2、created 实例初始化完毕,此时可以访问data中的数据和methods中的方法

(此时可以发送异步请求,渲染纯数据)

Vue实例挂载阶段

3、beforeMount 实例挂载到模板之前,进行模板编译,生成虚拟dom存放到内存中:
    (1)先看有没有el选项,没有el选项也是可以的,使用vm.$mount("#app")也可以实现挂载

    (2)然后再看有没有template选项,如果没有,就选择外部的html作为模板进行编译;如果有,就把template编译成render函数。(也就是说,如果有template选项,就以template为模板进行解析,如果我们还手动写了一个render函数,就以render创建的html元素为模板进行解析)

4、mounted 实例挂载到模板上,此时可以访问dom节点。

(此时也可以发送异步请求,主要是用来渲染图表之类数据,还有数据联动)

(前四个生命周期都只会执行一次,而beforeUpdate和updated会执行多次,只要有数据发生改变,它们就会执行。)

Vue实例更新阶段

5、beforeUpdate 实例数据变化触发的生命周期,此时重新编译数据对应的视图层dom元素(使用diff算法更新视图)

6、updated 实例数据变化触发的生命周期,此时数据已经是最新的,并且视图重新渲染完毕

(当我们关闭项目或切换组件时Vue实例就会被销毁,我们也可以使用vm.$destroy()手动销毁Vue实例。)

Vue实例销毁阶段

7、beforDestroy 实例销毁之前,此时仍然可以访问到Vue实例

8、destroyed 实例销毁完毕,清除监听器、子组件和事件监听,此时数据发生改变也不会重新编译模板了 

代码展示:

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.7.10"></script>

</head>

<body>
  <div id="app">
    <!-- vue中使用ref属性来唯一标识一个html元素,相当于id -->
    <div ref="container"></div>
    {{msg}}
    <button @click="update">更新数据</button>
    <button @click="destroy">销毁实例</button>
  </div>
  <script>
    let vm = new Vue({
      el: '#app',
      data: {
        msg: 'hello Vue'
      },
      // template: '<h1>{{msg}}</h1>',
      // render(h) {
      //   return h('h2', {}, this.msg)
      // },
      methods: {
        update(){
          this.msg = 'hello world!'
        },
        destroy(){
          vm.$destroy()
        }
      },
      // 生命周期
      beforeCreate() {
        console.log('beforeCreate 实例初始化之前', this.msg);
      },
      created() {
        console.log('created 实例初始化完成 访问data和methods', this.msg);
      },
      beforeMount() {
        console.log('beforeMount 实例挂载到页面之前', this.$refs['container']);
      },
      mounted() {
        console.log('mounted 实例挂载到页面上 可以访问dom元素 异步请求', this.$refs['container']);
      },
      beforeUpdate() {
        console.log('beforeUpdate 实例更新之前');
      },
      updated() {
        console.log('updated 实例更新完毕');
      },
      beforeDestroy() {
        console.log('beforeDestroy 实例销毁之前', this.msg);
      },
      destroyed() {
        console.log('destroyed 实例销毁完成', this.msg);
      }
    });
    // vm.$mount('#app')
    // setTimeout(()=>{
    // 	// vm.msg='hello world'
    // 	// 手动销毁实例
    // 	vm.$destroy()
    // },8000)
  </script>
</body>

</html>

运行结果: 

 

相关文章:

  • Java顺序表的实现
  • 金仓数据库KingbaseES数据库参考手册(服务器配置参数18. 开发者选项)
  • mysql 跨库数据清洗方案
  • pandas数据映射,更改列名,批量映射替换某列数据replace、map、apply、rename对比
  • 未婚妻晚安之后依然在线,于是我用20行代码写了个小工具
  • MySQL进阶第二天——索引
  • 低代码 low-code
  • 数字经济增长下,数据共享对于企业而言意味着什么?
  • 浙大MEM网上报名关键信息点提醒,选错一个,回头重来
  • 基于Spring Boot的动物救助中心系统
  • 6.HTML标签/元素学习
  • 没前端项目经验很难找实习吗?
  • C#基础--委托、lambda表达式和事件
  • LeetCode 0316. 去除重复字母:单调栈
  • 算法-二叉树
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • 【comparator, comparable】小总结
  • Docker: 容器互访的三种方式
  • GraphQL学习过程应该是这样的
  • Javascript基础之Array数组API
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • Leetcode 27 Remove Element
  • python3 使用 asyncio 代替线程
  • SpingCloudBus整合RabbitMQ
  • 服务器从安装到部署全过程(二)
  • 浮动相关
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 小而合理的前端理论:rscss和rsjs
  • 你对linux中grep命令知道多少?
  • ​如何在iOS手机上查看应用日志
  • #前后端分离# 头条发布系统
  • $ git push -u origin master 推送到远程库出错
  • ( 10 )MySQL中的外键
  • (11)MATLAB PCA+SVM 人脸识别
  • (js)循环条件满足时终止循环
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (转)菜鸟学数据库(三)——存储过程
  • (转)甲方乙方——赵民谈找工作
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .NET Core 中的路径问题
  • .NET delegate 委托 、 Event 事件,接口回调
  • .Net(C#)自定义WinForm控件之小结篇
  • /run/containerd/containerd.sock connect: connection refused
  • @Valid和@NotNull字段校验使用
  • [3300万人的聊天室] 作为产品的上游公司该如何?
  • [Android]使用Git将项目提交到GitHub
  • [AUTOSAR][诊断管理][ECU][$37] 请求退出传输。终止数据传输的(上传/下载)
  • [BZOJ] 1001: [BeiJing2006]狼抓兔子
  • [C#]winform部署yolov9的onnx模型