Vue生命周期--Vue实例创建过程详解

news2025/7/14 10:49:30

每个Vue实例在被创建时都要经过一系列的初始化过程--例如,需要设置数据监听、编译模板、将实例挂载到DOM并在数据变化时更新DOM等。同时在这个过程中也会运行一些叫做 生命周期钩子的函数,这给了用户在不同阶段添加自己的代码的机会。

生命周期图示:

一共有八个生命周期钩子函数:beforeCreate、created、beforeMount、mounted、beforeUpdate、updated、beforeDestroy、destroyed;

创建阶段有四个:beforeCreate、created、beforeMount、mounted、

更新阶段有两个:beforeUpdate、updated、

销毁阶段有两个:beforeDestroy、destroyed、

创建阶段的四个生命周期函数,从Vue创建只能执行一次; 

更新阶段可以执行很多次;

生命周期钩子函数都是自动执行的,不需要我们手动操作;

函数介绍:

beforeCreate函数:

  • 类型:Function
  • 详细:在实例初始化之后,进行数据侦听和事件/侦听器的配置之前同步调用。
  • 图示:

  • beforeCreate函数在“事件和生命周期初始化”之后自动执行;
  • 事件和生命周期初始化也不是我们能控制的,是自动进行的;
  • 用法:
    var vm = new Vue({
            data:{
                a:1
            },
            beforeCreate(){
                console.log("a is:" + this.a)
            },
            // => a is:undefined
  • 此时因为还没有开始进行data状态捕获, 所以beforeCreate函数是访问不了data里的状态的;

 create函数:(常用)

  • 类型:Function
  • 详细:在实例创建完成后被立即同步调用。在这一步中,实例已完成对选项的处理,意味着以下内容已经被配置完毕:数据侦听(data里的状态需要被监听)、计算属性、方法、事件/侦听器的回调函数。然而,挂载阶段还没开始,且 $el  property目前尚不可用。
  • 图示:

  • 注入和反应这个阶段做的事:在这里其中有一件事情是给Vue实例绑上data,当一个Vue实例被创建时,它将data对象中所有的property加入到Vue的响应式系统中。当这些property的值发生改变时,视图将会产生“响应”,即匹配更新为新的值。这时候页面也会进行重新渲染更新页面。 
  • 用法:
    var vm = new Vue({
            data:{
                a:1
            },
            created:function(){
                //` this` 指向 vm 实例
                console.log("a is:" + this.a)
            }
        })
        // => "a is: 1"
  • 因为此时Vue已经绑定了data,进行了数据监听捕获, 所以created函数能访问到data里的状态 a;
  • 所以在created函数阶段里常做的事情(用法):初始化状态或者挂载到当前实例的一些属性,如下图:
    var vm = new Vue({
            data:{
                a:1
            },

            created:function(){
                //` this` 指向 vm 实例
                console.log("a is:" + this.a) // => "a is: 1"
                this.a = this.a+"222" //初始化状态a,更改a的值
                this.globalName = "this可以直接访问的属性值" //this下面的属性,不在data里定义,vm访问不到
                console.log(this.globalName) // => "this可以直接访问的属性值"
                console.log(vm.globalName) // => 报错,vm访问不到
            }
        })

初始化状态是:

this.a = this.a+"222" //初始化状态a,更改a的值

挂载到当前实例的属性:globalName

this.globalName = "this可以直接访问的属性值" //this下面的属性,不在data里定义,vm访问不到
  • globalName是this下面直接挂的属性,不是状态没有在data中定义,所以this可以访问到,但是vm访问不到;

beforeMount函数:

  • 类型:Function
  • 详细:在挂载开始之前被调用;相关的render函数首次被调用,该钩子在服务器端渲染期间不被调用;
  • 图示:

  • 注意:el里的模板和template模板是不能同时渲染的,只能选一个为模板;如果只有el存在,就渲染el里的outerHTML作为模板,如:根组件,根组件里也是可以有template;如果el和template,就优选选择template的模板,el模板就会被覆盖掉,不会渲染;
  • outerHTML指的是包含当前节点的所有子节点;
  • 所以在created->beforeMound阶段,就是绑dom; 
  • 用法:
<body>
    <div id="box">
        <span>{{message}}</span>
    </div>
    <script>
        var vm = new Vue({
            el:"#box",
            data:{
                message:"生命周期"
            },
            
            beforeMount(){
                console.log(this.$el)// 模板解析之前最后一次修改模板节点
            }
        })
    </script>
</body>

结果:

  • 在这个函数阶段并不能拿到真正的dom节点,虽然拿到了dom节点,但是message的值还没有被更新。因此,此时dom元素还是以虚拟形式存在,
  • 作用:这个函数阶段是:模板解析之前最后一次修改模板节点时期; 

mounted函数:(常用)

类型:Function

详细:实例被挂载后调用,这时el被新创建的 vm.$el 替换了。如果根实例挂载到一个文档内的元素上,当 mounted 被调用时 vm.$el 也在文档内。

注意:mounted 不会保证所有的子组件也都被挂载完成。如果你希望等到整个视图都渲染完毕再执行某些操作,可以在 mounted 内部使用 vm.$nextTick:

    mounted(){
         this.$nextTick(function(){
              //仅在整个视图都被渲染之后才会运行的代码
         })
    }
  • 该钩子在服务器端渲染期间不被调用; 

图示:

  • 在这个绿色的阶段是把假的模板给删掉,用解析完的dom替换,假的模板也就是beforeMount时期获取到的el模板没有解析的模板,绿色阶段就是把解析完的真实dom替换到原来的假的模板。

用法:

mounted(){
      console.log("挂载后:真正获取到dom节点",this.$el)
}

结果: 

作用:在这个函数阶段可以进行下面的操作

(1)依赖于dom创建之后,才进行初始化工作的插件(例如:轮播插件)

(2)订阅 bus.$on

(3)发ajax 

上述四个生命周期函数,从Vue创建只能执行一次; 

beforeUpdate函数:

  • 类型:Function
  • 详细:在数据发生改变后,DOM被更新之前被调用。这里适合在现有DOM将要被更新之前访问它,比如移除手动添加的事件监听器。
  • 该钩子在服务器端渲染期间不被调用,因为只有初次渲染会在服务器端进行。
  • 图示:

 用法:

beforeUpdate(){
      console.log("更新之前,记录老的dom某些状态,比如滚动条位置记录")
},
  • 这个时候data里状态的值已经改变了,但是还没有进行dom的更新,在更新之前可以记录老的dom状态;

updated函数:

类型:Function

详细:在数据更改导致的虚拟DOM重新渲染和更新完毕之后被调用

当这个钩子函数被调用时,组件DOM已经更新,所以你现在可以执行依赖于DOM的操作。然而在多数情况下,你应该避免在此期间更改状态。如果要相应状态改变,通常最好使用计算属性或者watcher取而代之。

注意:updated 不会保证所有的子组件也都被重新渲染完毕。如果你希望等到整个视图都渲染完毕,可以在updated里使用 vm.$nextTick 

    updated:function(){
                this.$nextTick(function(){
                    //仅在整个视图都被重新渲染之后才会运行的代码
                })
            }

该钩子在服务器端渲染期间不被调用。 

图示:

 用法:

<body>
    <div id="box">
        {{message}}
        <button @click="message='11111'">按钮</button>

    </div>
    <script>
        var vm = new Vue({
            el:"#box",
            data:{
                message:"生命周期"
            },
            
            beforeUpdate(){
                console.log("更新之前,记录老的dom某些状态,比如滚动条位置记录")
            },
            updated(){
                console.log("状态更新完成,获取更新后的dom,才进行swiper工作的插件")
            },
        })
    </script>
</body>
  • updated是状态message更新完,页面dom更新完执行的;

结果:

 

beforeDestroy函数

类型:Function

详细:实例销毁之前调用。在这一步,实例仍然完全可用。

该钩子在服务器端渲染期间不被调用。

图示:

 用法:

    beforeDestory(){
                console.log("清除定时器、事件解绑,,")
            }
  • 在这个阶段,我们可以做一些销毁实例里的定时器、事件解绑之类的;因为组件销毁,里面的定时器是受window控制的,不受组件控制,所以组件销毁是销毁不掉定时器的,所以需要我们手动销毁。 

destroyed函数

类型:Function

详细:实例销毁后调用。该钩子被调用后,对应Vue实例的所有指令都被解绑,所有的事件监听器被移除,所有的子实例也都被销毁。

该钩子在服务器端渲染期间不被调用。

图示:

用法:

    destroyed(){
                console.log("清除定时器,事件解绑,,,")
            }
  • 在这个阶段,我们可以做一些销毁实例里的定时器、事件解绑之类的;因为组件销毁,里面的定时器是受window控制的,不受组件控制,所以组件销毁是销毁不掉定时器的,所以需要我们手动销毁。 
  • 这个阶段和上一个阶段用法一样;
  • 销毁一般是放在子组件去进行的,在根组件里没意义;

注意:

不要在选项property或回调函数上使用箭头函数,比如created:() => console.log(this.a) 或 vm.$watch('a',newValue => this.myMethod())。因为箭头函数并没有this,this会作为变量一直向上级词法作用域查找,直至找到为止,经常导致 Uncaught TypeError:Cannot read property of undefined或Uncaught TypeError:this.myMethod is not a function 之类的错误。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/38263.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux入侵排查

Linux入侵排查 实验内容 当系统被黑客入侵、需短时间查找入侵来源&#xff0c;还原入侵事故过程&#xff0c;同时给出解决方案与防范措施。以下给出一些入侵排查思路 netstat -antpl 查看当前端口状态是LISTEN的端口 针对对外开放的端口&#xff0c;查看日志 先查看ssh爆破的…

OpenGL ES 学习(三) -- 绘制平面图形

上一章中&#xff0c;已经对 OpenGL 的编程语言 GLSL 和渲染模式有了一定的了解&#xff0c;今天&#xff0c;将运用之前的知识&#xff0c;完成一些平面图形的操作。效果如下&#xff1a; 如果你对 OpenGL 的基本概念或者渲染流程不清晰&#xff0c;建议先看 OpenGL ES 学习…

D. Insert a Progression(绝对值的性质)

Problem - 1671D - Codeforces 给你一个n个整数的序列a1,a2,...,an。你还得到了x个整数1,2,...,x。 每个整数可以插入序列的开头&#xff0c;也可以插入序列的结尾&#xff0c;或者插入序列的任何元素之间。 所得序列a′的得分是其中相邻元素的绝对差异之和&#xff08;∑i1n…

实验跟踪

管理和跟踪机器学习实验。 Intuition 到目前为止&#xff0c;一直在训练和评估不同的基线&#xff0c;但还没有真正跟踪这些实验。将解决这个问题&#xff0c;但定义一个适当的实验跟踪过程&#xff0c;将用于所有未来的实验&#xff08;包括超参数优化&#xff09;。实验跟踪是…

【JavaWeb】CookieSession

文章目录一.Cookie❤️1.Cookie的概念2.创建Cookie3.获取Cookie4.修改Cookie的值5.Cookie的生命周期控制6.Cookie有效路径Path的设置7.免输入用户名登录二.Session❤️1.session的概念2.Session的创建和获取3.Session域数据的存取4.Session的生命周期控制5.浏览器和Session之间…

pytorch深度学习实战lesson28

第二十八课 resnet的梯度计算&#xff08;如何缓解梯度问题&#xff09; 沐神说&#xff1a;“假设你在卷积神经网络里面&#xff0c;只要了解一个神经网络的话&#xff0c;你就了解 rest net 就行了。 rest net 是一个很简单的也是很好用的一个网络。这也是大家会经常在实际中…

OpenCV-Python小应用(六):车道线检测

OpenCV-Python小应用&#xff08;六&#xff09;&#xff1a;车道线检测前言前提条件实验环境基于霍夫变换的车道线检测参考文献前言 本文是个人使用OpenCV-Python的应用案例&#xff0c;由于水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。更多精彩内容&#xff…

【成为红帽工程师】第五天 NFS服务器

目录 一、NFS服务器简介 二、NFS的使用 三、客户端使用autofs自动挂载 四、相关实验 一、NFS服务器简介 NFS&#xff08;网络文件系统&#xff09;&#xff0c;是FreeBSD支持的文件系统中的一种&#xff0c;它允许网络中的计算机&#xff08;不同的计算机、不同的操作系统&…

Go学习之路:流程控制语句:for、if、else、switch 和 defer(DAY 1)

文章目录前引流程控制语句&#xff1a;for、if、else、switch 和 defer1.1、for循环语句/语法格式&#xff08;一&#xff09;1.2、for循环语句/省略前置后置语句&#xff08;二&#xff09;1.3、for循环语句/while&#xff08;三&#xff09;1.4、for循环语句/无限循环&#x…

美新科技过会:收入依赖美国、产能利用率低,林东亮等均为香港籍

11月25日&#xff0c;深圳证券交易所创业板披露的信息显示&#xff0c;美新科技股份有限公司&#xff08;下称“美新科技”&#xff09;获得上市委会议通过。据贝多财经了解&#xff0c;美新科技于2022年3月31日在创业板递交上市申请。 本次冲刺创业板上市&#xff0c;美新科技…

SpringCloudGateway--谓词(断言)

目录 一、定义 二、谓词使用 1、After 2、Before 3、Between 4、Cookie 5、Header 6、Host 7、Method 8、Path 9、Query 10、RemoteAddr 11、Weight 一、定义 SpringCloudGateway中三个重要词汇&#xff1a; 路由&#xff08;Route&#xff09;&#xff1a;配置网…

傻白入门芯片设计,芯片键合(Die Bonding)(四)

目录 一、键合( Bonding) 1. 什么是键合(Bonding)&#xff1f; 2. 芯片键合步骤 3&#xff0e;芯片拾取与放置(Pick & Place) 4. 芯片顶出(Ejection)工艺 5. 使用环氧树脂(Epoxy)实现粘合的芯片键合工艺 6. 使用晶片黏结薄膜&#xff08;DAF&#xff09;的芯片键合工…

Redis实战篇(三)秒杀

一、全局唯一ID &#xff08;1&#xff09;定义 全局ID生成器&#xff0c;是一种在分布式系统下用来生成全局唯一ID的工具&#xff0c;一半满足下列特性&#xff1a; 唯一性高可用高性能递增性安全性 为了增加ID的安全性&#xff0c;我们不直接使用Redis自增的数值&#xf…

OpenCV-Python快速入门(十五):霍夫变换

OpenCV-Python快速入门&#xff08;十五&#xff09;&#xff1a;霍夫变换前言前提条件实验环境霍夫变换基本原理霍夫直线变换&#xff08;cv2.HoughLines()&#xff09;概率霍夫变换&#xff08;cv2.HoughLinesP()&#xff09;霍夫圆变换&#xff08;cv2.HoughCircles()&#…

移动端测试理论

App测试基础 App功能测试及专项测试 前言: 对于APP项目的测试&#xff0c;一般是进行系统测试。 测试主要从业务功能和非业务功能两个方面考虑。业务功能测试 根据软件说明&#xff0c;设计文档或用户需求验证App的各个功能的实现。 专项测试 兼容性测试 兼容性测试的关注点…

阿里Java研发面经(已拿offer)

一、自我总结&#xff1a; 1&#xff09;首先最重要的一点。对自己的要求高点。不要以简单的实习生来要求自己。你要想 你会的别人都会 你的核心竞争力是什么呢。所以楼主建议以Java高级工程师来要求自己。不会的就学嘛。人面对未知的事物 本能反应是恐惧与退缩。可当你尝试去…

Xxl-Job 初次体验

Xxl-Job 初次体验一、定时任务-前置知识二、演变机制三、xxl-Job 设计思想四、xxl-job 实战1. 调度中心部署2. 编写执行器简单使用一下2.1. 让执行器run起来&#xff01;2.2. 在调度中心配置任务&#xff0c;调度一下&#xff01;3. XxlJob 任务的生命周期4. 路由策略5. 父子任…

汇川PLC编程软件AutoShop的使用

文章目录一、数据类型二、系统参数.1、内存容量设置2、“掉电保持范围”设置3、系统设置三、符号表1、编辑符号表2、符号表的打印四、元件监控表1、新建元件监控表2、编辑元件监控表3、复制元件监控表4、快速监控表五、元件使用信息表六、交叉引用表七、软元件内存表1、新建和复…

windows的小米11真机appium微信爬虫

1、下载appium 仓库地址 2、下载python的包 pip install Appium-Python-Client -i https://pypi.tuna.tsinghua.edu.cn/simple 3、下载android-sdk 先下SDK Tools 国内一个镜像网站 参考这个教程 安装好后&#xff0c;运行这个SDK Manager.exe 然后install&#xff0c;同意协…

Alphalens使用方法细节判断

首先alphalens的数据格式&#xff1a; factor: MultiIndex&#xff08;用stack()方法来转换&#xff09; prices: DataFrame #转换成MultiIndex factor alpha_mom.stack() print (factor.tail()) datetime 2017-11-20 15:00:00 601857.XSHG 1…