Vue声明周期(笔记-自己的理解)

2023-11-08

这是vue的生命图示

一共有八个生命周期函数。

new Vue()

创建Vue实例 相当于以下代码

var vm = new Vue({})  

之后就是init Event 和 LifeCycle 初始化事件和生命周期函数

beforeCreate()

首先字面意思在创建之前,那么Vue会发生什么呢?

  • 初始化data里面的数据
  • 初始化方法事件
  • 将data里面的数据交给观察者实例 (watch)

此时若在代码中打印data里面的数据将undifined 因为是在初始化之前打印的

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
</head>
<body>
  <div id="app">
    {{message}}
  </div>
  <script>
    var vm = new Vue({
      el: '#app',
      data: {
        message:'hello world'
      },
      // new vue创建vue实例 -> init初始化生命周期函数 -> beforeCreated()
      beforeCreate() { 
        console.log(this.$el)
        console.log(this.message)
        console.log('----beforeCreate----') 
      }
    })
  </script>
</body>
</html>

created()

这时候数据初始化完毕,也已经有了methods里面的方法

在这个阶段,因为获得了data,那么我们就可以对后端接口发起请求,获取数据,这时候我们常常会写这样的代码:

created() {
  this.getData()
}

methods() {
  async getData(){
    awati xxx() //具体的请求方法
  }
}

接下来他会判断是否有挂载了el,其实就是在vue中需要这么一行代码

var vm = new Vue({
    el: '#app' //你html上的id 找到一个节点挂载
})  

如果没挂载,那么等待挂载当有事件触发挂载

就是类似于以下这种写法

var vm = new Vue({})

vm.$mount('#app') //需要挂载上去

接下来vue会判断有没有vue实例里面参数是否含有tempate模板

如果有则编译template并渲染成dom

<!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.6.14/dist/vue.js"></script>
</head>

<body>
  <div id="app"></div>
  <script>
    var vm = new Vue({
      data: {
        message: 'hello world'
      },
      template: '<div>我是模板内的{{message}}</div>',
      beforeMount(){
        console.log(this.$el)
      }
    })
    vm.$mount('#app')
  </script>
</body>

</html>

运行结果 

那此时我们如果有外部的html结构呢,会渲染哪一个呢?

<!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.6.14/dist/vue.js"></script>
</head>
<body>
  <div id="app">
    <span>我是span里的{{message}</span>
  </div>
  <script>
    var vm = new Vue({
      data: {
        message:'hello world'
      },
      template: '<div>我是模板内的{{message}}</div>',
    })
    vm.$mount('#app')
  </script>
</body>
</html>

为啥呢

beforemount()

这个函数运行的时候我们已经初始化了dom,也已经渲染上去了,但是数据呢没有绑定在模板之中就是相当于#app获取的dom结构,里面的数据依旧是{{xxx}}这种形式

接下来要做的就是data中的数据渲染到dom结构中,经过vue里面的一系列操作,数据就实现了双向绑定。

再回到之前的话题,为啥外部有html结构,内部有template页面最终渲染的确是template呢

在这个函数执行之后,就要渲染成render函数,他呢直接将vue内部的template的转化成render函数,生命周期会执行 replace el ,所以vue会替换掉之前的(#app) dom结构,渲染成内部template。

然后呢render

mounted()

数据已经绑定成功,dom完全渲染,此时可以操作dom了。

下面给出总图以及代码

<!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.6.14/dist/vue.js"></script>
</head>
<body>
  <div id="app">
    {{message}}
  </div>
  <script>
    var vm = new Vue({
      data: {
        message:'hello world'
      },
      template: '<div>我是模板内的{{message}}</div>',
      beforeCreate() { 
        console.log(this.$el)
        console.log(this.message)
        console.log('----beforeCreate----') 
      },
      created() {
        console.log(this.$el)
        console.log(this.message)
        console.log('----created----')
      },
      beforeMount () {
        console.log(this.$el)
        console.log(this.message)
        console.log('----beforeMount----')
      },
      mounted () {
        console.log(this.$el)
        console.log(this.message)
        console.log('----mounted----')
      },
      beforeDestroy(){
        console.log(this.$el)
        console.log(this.message)
        console.log('----beforeDestroy----')
      }
    })
    vm.$mount('#app')
  </script>
</body>
</html>

beforeUpdate()

数据的更新之前会new新得结点与之前节点比较并且查找到指定范围,最后更新里面的数据,并render渲染。

updated()

在updated也可以操作dom

不足之处希望大家批评指正

参考文章https://blog.csdn.net/weixin_42707287/article/details/111641286

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vue声明周期(笔记-自己的理解) 的相关文章

随机推荐

  • 利用java制作桌面应用程序_Java桌面应用

    对于作Java桌面应用来说 比较烦人的就是安装部署问题 客户端是否安装有jre jre版本问题 jre去哪下载 如 何用jre启动你的Java应 用 不要说刚接触电脑的人 就算是比较熟悉电脑 如果没有接触过Java 面对一个Java应用 如
  • Mysql复习总结

    目录标题 数据库特性 原子性 一致性 隔离性 持久性 Mysql事务所存在的问题 数据库隔离级别 Mysql中的log bin log VS redo log MVCC ACID如何被保证的 存储引擎 Innodb 和 MyISAM Inn
  • 百度云盘分享:MySQL零基础入门视频教程!

    百度云盘分享 MySQL零基础入门视频教程 首先给大家介绍一下数据库工程师 数据库工程师 Database Engineer 是从事管理和维护数据库管理系统 DBMS 的相关工作人员的统称 他属于运维工程师的一个分支 主要负责业务数据库从设
  • spark内存调优

    executor内存 1 RDD存储 persist cache操作 RDD持久化在executor中 注 UnifiedMemoryManager模式可设置spark storage memoryFraction调节 默认0 6 2 sh
  • 机器学习——决策树/随机森林

    0 前言 决策树可以做分类也可以做回归 决策树容易过拟合 决策树算法的基本原理是依据信息学熵的概念设计的 Logistic回归和贝叶斯是基于概率论 熵最早起源于物理学 在信息学当中表示不确定性的度量 熵值越大表示不确定性越大 ID3算法就是
  • nginx启动报错

    nginx启动报错 nginx报错如下 nginx emerg bind to 0 0 0 0 80 failed 10013 An attempt was made to access a socket in a way forbidde
  • python爬虫xpath教程

    环境准备 pycharm 撩妹神器 人手一个 lxml python的三方库 如果电脑里没有安装lxml的伙伴 可以安装一下 在控制台输入pip intall https pypi douban com simple lxml 利用国外的源
  • Vim编辑器

    1 Vim两种状态 命令状态 按i或者a可以进入编辑状态 编辑状态 左下角有insert 在命令状态下 有一些常用命令 新增 a 从光标后开始添加文本 A 从光标所在行的末尾开始添加文本 插入 i 从光标前面开始插入文本 I 从光标所在行的
  • 谈谈Linux下动态库查找路径的问题

    p p div class Blog wz1 span style font size 16px nbsp nbsp nbsp 学习到了一个阶段之后 就需要不断的总结 沉淀 清零 然后才能继续 上路 回想起自己当年刚接触Linux时 不管是
  • 笔记︱几款多模态向量检索引擎:Faiss 、milvus、Proxima、vearch、Jina等

    转自 https zhuanlan zhihu com p 364923722 引用文章 7 的开篇 来表示什么是 向量化搜索 人工智能算法可以对物理世界的人 物 场景所产生各种非结构化数据 如语音 图片 视频 语言文字 行为等 进行抽象
  • 关于keil卡在systeminit中,然后出现void HardFault_Handler(void)的几个问题详解

    版权声明 本文为博主原创文章 未经博主允许不得转载 https blog csdn net u013184273 article details 83860802 相信很多程序员在用keil的时候都会遇到在仿真调试时 一直停在SystemI
  • linux系统下更改pip默认下载源

    linux系统下更改pip默认下载源 很多教程让你创建什么什么文件的 不需要啊 不需要 我是用conda创建的虚拟环境 但是我喜欢用pip下载 在虚拟环境里面改这个配置就一句话 pip config set global index url
  • 51单片机测量方波信号周期

    利用T0作为定时器 T1作为计数器 主要思路 1 T1计数 工作模式 方式2 T0计时 工作模式 方式1 2 T1八位计数 赋初值0xFF 打开中断 开始计数 P3 5口输入被测量方波信号 3 进入T1中断 若TR0 0 则开始计时TR0
  • Solidity 合约安全,常见漏洞 (下篇)

    Solidity 合约安全 常见漏洞 下篇 Solidity 合约安全 常见漏洞 上篇 不安全的随机数 目前不可能用区块链上的单一交易安全地产生随机数 区块链需要是完全确定的 否则分布式节点将无法达成关于状态的共识 因为它们是完全确定的 所
  • React 常用的十个生命周期

    目录 前言 实例期 存在期 销毁期 总结 前言 学习一门语言 他的生周期我们是必须要理解 在这里就给大家讲解一下我们平常最常用到的一些生命周期 希望能给各位带来帮助 我们首先要知道 React的生命周期主要分为三部分 实例期 挂载期 存在期
  • yolov5 CUDA out of memory

    目录 yolov5 CUDA out of memory 训练笔记 训练时有时会可视化 生成anchors yolov5 CUDA out of memory yolov5训练 是1060 batch size为8 换一台电脑 batch
  • 技术选型:Sentinel vs Hystrix

    这是围绕 Sentinel 的使用场景 技术对比和实现 开发者实践等维度推出的系列文章的第三篇 第一篇回顾 Dubbo 的流量防卫兵 Sentinel如何通过限流实现服务的高可用性 传送门 第二篇回顾 RocketMQ 的保险丝 Senti
  • java jpa是什么_jpa是什么框架?jpa是什么意思?

    你了解jpa吗 很多人表示 对于jpa是一个什么框架并不是很了解 那么下面就一起通过下面的文章内容来了解一下jpa吧 jpa其实就是Java Persistence API的简称 它的中文名字是Java持久层API 是JDK 5 0注解或者
  • 【Java笔记+踩坑】MyBatisPlus基础

    导航 黑马Java笔记 踩坑汇总 JavaSE JavaWeb SSM SpringBoot 瑞吉外卖 SpringCloud SpringCloudAlibaba 黑马旅游 谷粒商城 目录 1 MyBatisPlus简介 1 1 回顾Sp
  • Vue声明周期(笔记-自己的理解)

    这是vue的生命图示 一共有八个生命周期函数 new Vue 创建Vue实例 相当于以下代码 var vm new Vue 之后就是init Event 和 LifeCycle 初始化事件和生命周期函数 beforeCreate 首先字面意