首页 > 其他分享 >Vue生命周期详解(八个钩子)

Vue生命周期详解(八个钩子)

时间:2024-04-10 18:29:06浏览次数:25  
标签:Vue console log DOM 钩子 app 详解 name

定义:

        一个Vue实例从开始创建一直到销毁的整个过程,称之为生命周期


作用:

        Vue框架的内置函数,随着组件的生命周期阶段的不同,会自动执行的函数,并且在特定的阶段做某件事,只需要调用相应的钩子函数即可。

        我们可以通过使用生命周期(钩子)函数来判断Vue生命周期到达了什么阶段。


生命周期是什么

生命周期分为4个阶段,8个方法。Vue生命周期过程中,会自动运行一些函数,被称为生命周期钩子,让开发者在特定的阶段可以运行自己的代码。如图:

beforeCreate:创建之前;            created:创建之后

beforeMount:挂载之前;            mounted:挂载之后

beforeUpdate:更新之前;           updated:更新之后

beforeDestroy:销毁之前;          destroyed:销毁之后


初始化阶段:

        准备响应式数据,进行数据的响应式处理,经过创建阶段,该数据就变为了响应式数据。

挂载阶段:

        webpack打包,挂载,简而言之就是渲染模板的阶段,在页面当中可以看到我们所编写的相应结构

更新阶段:

        与页面进行交互的时候,进行数据的修改和视图的更新,不同于初始化阶段和挂载阶段,这个阶段会进入到一个循环,进行反复的修改和更新。

销毁阶段:

        进行实例的销毁,不用的组件进行释放


八个钩子:

<script>
    const app = new Vue(
        {
            el: '#app',
            data:{
                name: '橙子味热果汁'
            },
            beforeCreate(){
                console.log('初始化之前');
            },
            created(){
                console.log('初始化之后');
            },
            beforeMount(){
                console.log('挂载之前');
            },
            mounted(){
                console.log('挂载之后');
            },
            beforeUpdate(){
                console.log('更新之前');
            },
            updated(){
                console.log('更新之后');
            },
            beforeDestroy(){
                console.log('销毁之前');
            },
            destroyed(){
                console.log('销毁之后');
            }
        }
    )
</script>

八个钩子详解:

beforeCreate

        初始化事件、生命周期等,但数据的代理还未开始。此时无法通过Vm访问到data中的数据、method当中的方法

 const app = new Vue(
        {
            el: '#app',
            data:{
                name: '橙子味热果汁'
            },
            beforeCreate(){
                console.log(this.name);
            },
        }
    )

        因为响应式数据还未准备,没有被注入数据,所以控制台输出结果为undefined

created

        可以通过Vm访问到data当中的数据、methods当中配置的方法,发送初始化渲染的请求。:在创建阶段结束后,vue开始解析模板,生成虚拟的Dom(内存当中),但页面还不能显示出来解析好的内容。

        DOMdocument object model文档对象模型,选中html标签,进行操作或获取数值)

beforeCreate(){
                console.log(this.name);
            },
created(){
                console.log(this.name);
            },

        在浏览器的控制台获取到的name,beforeCreated没有获取到data中的数据,而created阶段获取到了data中的数据


在这里解释一下为什么用this:

        在Vue的生命周期中,对于普通函数,this指的是直接的调用者,如果没有直接调用者,this指的是window;另外的箭头函数是没有自己的this,在它内部使用的this是由它定义的对象决定的。


beforeMount

        此时页面呈现的是未经Vue编译的Dom结构,所有对Dom的操作最终都是不奏效的,可以在这里做初始数据的获取

<body>
   <div id="app">
    <!-- <p @click="reduce">-</p> -->
    <h1>{{ name }}</h1>
    <p>+</p>
   </div>
</body>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.js"></script>
<script>
    const app = new Vue(
        {
            el: '#app',
            data:{
                name: '橙子味热果汁'
            },

            beforeMount(){
                console.log(document.querySelector('h1').innerHTML);
            },
</script>

    

mounted

        在beforeMount-mounted阶段会将内存中的虚拟DOM转为真实的DOM插入页面。此时页面会显示经过Vue编译的DOM,对DOM的操作均有效,至此初始化过程结束。一般会在此进行开始定时器、绑定自定义的事件等初始化操作

        注:用了Vue就尽量少操作Dom
        

            beforeMount(){
                console.log(document.querySelector('h1').innerHTML);
            },
            mounted(){
                console.log(document.querySelector('h1').innerHTML);
            },

        从中获取h1里面的内容,在浏览器的控制台里展示出来,可以看到before里面仍然是name,并没有进行挂载操作,在mounted输出的则是在data里面定义的name:“橙子味热果汁”


这里做一个createdmounted去请求数据的区别:

        一般来说用created的比较多,created是在渲染之前进行调用,通常先初始化属性,然后再做渲染;mounted是在模板渲染完成后,一般都是初始化页面之后,再对元素节点进行操作,在这里请求数据就可能会出现不规则闪动问题。

        在请求数据的数据对DOM有影响就用created;请求数据与DOM无关用mounted。

注:在运行周期函数的时候,一般情况下只会进行初始化阶段和挂载阶段


beforeUpdate

        与页面进行交互,修改数据的时候进行触发,此时数据是新的,但是页面是旧的,即:页面还没有和数据保持同步

在这里可以用一个计数器来表示出来

<body>
   <div id="app">
    <span style="font-size: 50px;">{{ count }}</span>
    <button @click="count++">点我加1</button>
   </div>
</body>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.js"></script>
<script>
    const app = new Vue(
        {
            el: '#app',
            data:{
                count: 1
            },
            
            beforeUpdate(){
                console.log('更新之前',document.querySelector('span').innerHTML);
            },
</script>

        可以看到点击了一次按钮,数据修改了,而视图还没有更新,这就是beforeUpdate

updated

        根据新数据,生成新的虚拟DOM,随后与旧的DOM进行比较,最终完成了页面的更新,数据进行了修改,并且视图也进行了更新。即:页面与数据保持了同步

beforeUpdate(){
                console.log('更新之前',document.querySelector('span').innerHTML);
            },
updated(){
                console.log('更新之后',document.querySelector('span').innerHTML);
            },

beforeDestroy

        VM中的所有指令都处于可用状态,马上要执行销毁过程,一般在此阶段,释放vue以外的资源,例如关闭定时器等收尾操作

destroyed

        所有的事件监听,所有跟vue相关的绑定,全部都进行了销毁,相当于这个DOM的结构跟Vue无关了

        在控制台进行了销毁阶段,app.$destroy(),我们这个DOM关于点击加1的功能就不能用了。我们可以自行实现一下这段代码,

<body>
   <div id="app">
    <span style="font-size: 50px;">{{ count }}</span>
    <button @click="count++">点我加1</button>
   </div>
</body>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.js"></script>
<script>
    const app = new Vue(
        {
            el: '#app',
            data:{
                count: 1
            },
            
            beforeUpdate(){
                console.log('更新之前',document.querySelector('span').innerHTML);
            },
            updated(){
                console.log('更新之后',document.querySelector('span').innerHTML);
            },
            beforeDestroy(){
                console.log('销毁之前');
            },
            destroyed(){
                console.log('销毁之后');
            }
        }
    )
</script>

标签:Vue,console,log,DOM,钩子,app,详解,name
From: https://blog.csdn.net/m0_74995879/article/details/137567995

相关文章

  • WiFi6详解
    移动互联网时代,“WiFi”和“4G”一直是两个并存的名词——4G网络在室外给我们提供高速流量,WiFi则在室内给我们提供了真正的不用操心的“无限流量”。可以说生活在当下的我们,这两样东西一个不但都离不了且一刻也离不开。想想看如果你的手机断了网,你的焦虑症恐怕就上来了。关于......
  • MQTT协议特点及数据包结构详解(值得珍藏)
    点击下载《MQTT协议特点及数据包结构详解(值得珍藏)》1.前言MQTT(MessageQueuingTelemetryTransport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于,用极少的代码和有......
  • vue中:key 的特殊使用
    1.常用的使用方法v-for 结合使用1<ul>2<liv-for="iteminitems":key="item.id">...</li>3</ul>唯一的key值在做虚拟DOM算法时尤为重要2.触发子组件并进行更新组件让其发生变化1<childrenComponentsv-model="files":key="uploadKey&q......
  • vue简单的响应式布局
    <template><el-container><el-header>头部</el-header><el-container><!--准备两份aside侧边栏--><!--利用isCollapse动态控制侧边栏的宽度--><el-aside:width="isCollapse?'64px':'......
  • 【Vue I18n 国际化插件】vue3+vue-i18n 项目实战总结
    一、为什么要国际化?前端国际化:应用要服务于不同的地区的用户,所以应用不能单一语言;应用要能让不同地区的人无障碍使用就需要实现国际化。目前在各大商城项目中,对于国际化语言的需求越来越高了,其中最多的就是vue项目使用i18n插件实现多语言切换功能。前端国际化:应用要......
  • Oracle分析函数- count()/sum() over(partition by 分组 order by 排序) 详解
    优点:代码简单明了,并且执行效率高,(不影响总的记录数)如果不用这种函数去写,按照平时我们的思路首先想到的可能是子查询,那么将至少会走4次以上的全表扫描:(1)每个订单中产品数量大于3的产品至少1个(003,004)(2)每个订单中折扣标志为'1'的产品至少有2个(002,004)(3)每个订单......
  • vue3复盘学习(一)
    其实说是复盘,因为在平常的开发中因为公司一些项目和其他原因断断续续的使用了一段时间vue3,因为着急赶项目,有些知识点没有系统性学习,所以决定从今天开始一点点再学习一遍٩(•̤̀ᵕ•̤́๑)ᵒᵏᵎᵎᵎᵎ哈哈!刚开始从vue2过渡到vue3的同学们其实是有些不适应的,但是随着前端框......
  • Vue — Vue面试题:Vue3.0 特性
    CompositionAPI(组合式API):CompositionAPI允许开发者将逻辑按照功能或者相关性进行组织,而不是按照选项的不同部分(如data、methods、computed等)来分散代码。这种方式更灵活、更易于复用和维护,特别适用于编写大型复杂的组件。基于Proxy的响应式系统:Vue3中的响应式系统基于ES6......
  • [echarts]vue2项目中折柱图-柱形图伪3d效果实现
    不知道是不是现在的版本更新了,echarts-gl在vue2项目中不能适配使用,难蹦一.需求分析与设计思路项目当中遇到改版升级,想要实现如下的一下折柱图的立体效果想在原来平面柱状图的基础上,有立体的效果.本来打算用echarts-gl库来实现3d版的柱形图,但是引入和配置后,浏览器总是......
  • Unity3D代码混淆方案详解
    背景Unity引擎使用Mono运行时,而C#语言易受反编译影响,存在代码泄露风险。本文通过《QQ乐团》项目实践,提出一种适用于Unity引擎的代码混淆方案,以保护代码逻辑。引言在Unity引擎下,为了防止代码被轻易反编译,需要采取相应的保护措施。本文将分享一种基于实践经验的可行方案,希......