【面试】生命周期详情解释及案例

news2025/1/8 5:42:04

目录

1.什么是生命周期

2.生命周期函数

3.vue2中生命周期的函数

4.生命周期的阶段

5.生命周期图示

第一个阶段:组件创建阶段

第二个阶段:编译HTML模板并渲染到浏览器中

第三阶段:组件更新阶段

第四阶段:组件销毁阶段


1.什么是生命周期

所谓得生命周期是指该组件对象从开始到销毁回收的整个全过程

2.生命周期函数

在生命周期中被定义执行的函数我们称为生命周期函数,也称为钩子函数

3.vue2中生命周期的函数

整个组件从开始到销毁要经过生命周期的阶段,每到一个阶段,相对应的函数就会被执行

生命周期含义
beforeCreate在组件创建之前被调用
created在组件创建之后被调用
beforeMount模板编译、挂载之前被调用
mounted模板编译、挂载之后被调用
beforeUpdate组件更新之前被调用
updated组件更新之后被调用
beforeDestory在组件销毁之前被调用
destoryed在组件销毁之后被调用

4.生命周期的阶段

生命周期的一共有三个阶段

组件的创建阶段:该生命周期的函数只能被执行一次

组件的运行阶段:该阶段的钩子会被调用多次

组件的销毁阶段:该阶段的生命周期也只能执行一次

5.生命周期图示

第一个阶段:组件创建阶段

  • new Vue():创建组件的实例对象
  • Init Events & Lifecycle:初始化事件和生命周期函数
  • beforeCreate:组件中的props/data/methods这些尚未创建,都处于不可用状态,在实际开发过程中几乎没有用处
  • Init injections & reactivity:组件props/data/methods才开始初始化这些选项
  • created:组件中的props/data/methods这些数据已经初始化成功,但是这里不能访问页面的DOM元素,因为此时模板还没有被编译创建出来
   beforeCreate(){
     console.group('----1、beforeCreate--------');
     console.log('data',this.num);  //undefined
     console.log('methods',this.fn); //undefined
     console.log('props',this.ptitle);//undefined
     console.groupEnd()
   },
  created(){
    console.group('----2、created--------');
    console.log('data',this.num);//可以访问数据为0
    console.log('methods',this.fn);  //也可以访问
    console.log('props',this.ptitle); //也可以访问
    console.log('dom元素', this.$refs.titleDom); //不能访问,这里的数据为undefined,因为模板没有创建
    console.groupEnd()
  }

总结:在实际开发过程中beforeCreate几乎不用,created使用的比较多,一般情况在这里完成网络请求和后端交互,还有一些初始化的操作、创建定时器等功能

向后端发送网络请求的技术有三种

  • Ajax方式:这种方式存在的弊端就是  “在动态更新页面的情况下,用户无法回到前一页的页面状态,因为浏览器仅能记忆历史纪录中的静态页面”
  • fetch方式:这种实际上对Ajax的封装,比Ajax要强
  • axios方式:目前使用最多的一种

案例1:使用原生ajax获取网络数据

第1步:在src/utils目录下创建request.js文件,该文件用于封装ajax请求

//method:请求方式。url:端口号
export function ajax(method, url) {
    //当异步任务顺利完成且返回结果值时,会调用resolve函数
    //当异步任务失败且返回失败原因(通常是一个错误对象)时,会调用reject函数
    return new Promise((resolve, reject) => {
        //创建XMLHttpRequest对象
        let xhr = new XMLHttpRequest();
        //初始化XMLHttpRequest对象
        xhr.open(method, url, true);
        //如果是get请求,则发送信息
        xhr.send();
        //设置回调函数
        xhr.onreadystatechange = function () {
            //判断状态码必须是4
            if (xhr.readyState == 4) {
                //判断响应码的是200的时候返回数据
                if (xhr.status == 200) {
                    //获取服务端发送回来的数据
                    resolve(xhr.responseText);
                } else {
                    reject("network failure");
                }
            }
        };
    });
}

第二步:在组件中引入的created函数中调用获取网络数据

import {ajax} from '@/utils/request'
export default {
    data(){
        return{
            list:[]
        }
    },
    methods:{
       async getOperas(){
            //使用async/await
            let response=await ajax('GET','https://www.fastmock.site/mock/4441a79ad5f884f83b784cf4c588bdb6/movies/getAllOperas')
            this.list=JSON.parse(response).operas;
        }
    },
     created(){
       //使用then方式获取promies成功后的数据
    //    ajax('GET','https://www.fastmock.site/mock/4441a79ad5f884f83b784cf4c588bdb6/movies/getAllOperas').then(response=>{
    //        //将返回回来的数据由JSON转成js对象
    //        let result=JSON.parse(response)
    //        console.log(result.operas);
    //        //将获取的数据赋值给data的list数据
    //        this.list=result.operas
    //    })
        this.getOperas()
    }
}

第3步:在template模板中渲染

<template>
    <div>
        <h1>获取所有的电影院信息</h1>
        <ul> 
            <li v-for="item in list" :key="item.id">{{item.name}}</li>
        </ul>
    </div>
</template>

第二个阶段:编译HTML模板并渲染到浏览器中

  • 这个过程的主要工作可以理解为将data中数据读到内存中,在填充到template之后进行编译,这个编译的过程由 vue-template-compiler这个依赖包来完成编译的
  • beforeMount:将内存中编译好的HTML结构渲染到浏览器中,此时浏览器还没有当前DOM结构,不能再这个钩子函数中直接操作DOM
  • create vn.$el and replace "el" wth it:用内存中编译好的HTML结构,替换掉el属性指定的DOM元素
  • mounted:已经把内存中的HTML结构成功的渲染到了浏览器之中,此时你可以直接在这个钩子函数中caozuoDOM元素了

第三阶段:组件更新阶段

  • 当数据变化的时候就会触发beforeUpdate(此时data数据是实时更新的,但是DOM元素里的数据始终未初始数据)
  • Virtual DOM re-render and patch:根据最新的数据,重新渲染组件的DOM结构
  • updated:已经是最新的数据,完成了组件的DOM结构的重新渲染(data数据是实时更新的,DOM元素里的数据也是实时更新的)

第四阶段:组件销毁阶段

  •  beforeDestory:组件即将销毁,此时尚未销毁组件,组件还能正常运行,一般在这个函数会完成资源的释放操作
  • Teardown watchers,child components and event listeners:销毁当前组件的侦听器、子组件、事件监听
  • destoryed:组件已经被销毁,此组件在浏览器中的DOM已经被完全移除

案例:停止定时器操作

 created(){
    //定义一个间隔定时器,每隔1秒钟进行加1操作
    this.times=setInterval(() => {
      console.log('num',this.num);
      this.increment()
    }, 1000);
 }
 beforeDestroy(){
    console.log('---7、beforeDestroy-------------');
    //调用销毁定时器的方法
    clearInterval(this.times)
  }

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

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

相关文章

【数据结构】基础:图的基本概念与实现(附C++源代码)

【数据结构】基础&#xff1a;图的基本概念与实现&#xff08;附C源代码&#xff09; 摘要&#xff1a;将会在数据结构专题中开展关于图论的内容介绍&#xff0c;其中包括四部分&#xff0c;分别为图的概念与实现、图的遍历、图的最小生成树以及图的最短路径问题。本文将介绍图…

遗传算法(Genetic Algorithm,GA)实现数据排序,python

遗传算法(Genetic Algorithm,GA)实现数据排序&#xff0c;python 遗传算法是一种比较广泛、通用的算法体系&#xff0c;为了说明遗传算法的原理和实现&#xff0c;现在用GA解决一个计算机科学最基本、最古老的问题&#xff1a;排序问题。 需要特别说明的是&#xff0c;遗传算…

【GPLT 三阶题目集】L3-016 二叉搜索树的结构

二叉搜索树或者是一棵空树&#xff0c;或者是具有下列性质的二叉树&#xff1a; 若它的左子树不空&#xff0c;则左子树上所有结点的值均小于它的根结点的值&#xff1b;若它的右子树不空&#xff0c;则右子树上所有结点的值均大于它的根结点的值&#xff1b;它的左、右子树也分…

代码随想录LeetCode | 单调栈问题

前沿&#xff1a;撰写博客的目的是为了再刷时回顾和进一步完善&#xff0c;其次才是以教为学&#xff0c;所以如果有些博客写的较简陋&#xff0c;是为了保持进度不得已而为之&#xff0c;还请大家多多见谅。 预&#xff1a;看到题目后的思路和实现的代码。 见&#xff1a;参考…

两种特征提取方法与深度学习方法对比的小型金属物体分类分析研究

本文讨论了用于对包括螺丝、螺母、钥匙和硬币在内的小型金属物体进行分类的两种特征提取方法的效率&#xff1a;定向梯度直方图 (HOG) 和局部二进制模式 (LBP)。首先提取标记图像的所需特征并以特征矩阵的形式保存。使用三种不同的分类方法&#xff08;非参数 K 最近邻算法、支…

云计算|OpenStack|社区版OpenStack(实务操作---cloud-init的使用)

前言&#xff1a; 接上一篇文章&#xff1a;https://zskjohn.blog.csdn.net/article/details/128931042 我们可以从官方获取到现成的镜像&#xff0c;例如&#xff0c;从Ubuntu 18.04 LTS (Bionic Beaver) Daily Build [20230210]官方下载的bionic-server-cloudimg-amd64.img…

春招Leetcode刷题日记-D2-贪心算法-区间问题

D2-贪心算法-区间问题力扣435. 无重叠区间思路代码力扣435. 无重叠区间 题目链接&#xff1a;435. 无重叠区间 思路 1、贪心策略&#xff1a; 1、题目中&#xff0c;给了若干个区间&#xff0c;现在&#xff0c;我想留下尽可能多的&#xff0c;不重叠的区间 2、考虑&#…

Git配置多仓库账户密码

前言说明&#xff1a; 由于我们在工作中可能会遇到公司是用的gitlab仓库&#xff0c;代码下载需要github仓库&#xff0c;自己的项目需要gitee仓库&#xff0c;如何在同一台电电脑配置多个仓库账户密码就尤为重要。 (一) 配置流程 这里是在windows电脑上配置多仓库以github为例…

使用Spring框架的好处是什么

使用Spring框架的好处是什么&#xff1f; 1、轻量&#xff1a;Spring 是轻量的&#xff0c;基本的版本大约2MB。 2、控制反转&#xff1a;Spring通过控制反转实现了松散耦合&#xff0c;对象们给出它们的依赖&#xff0c;而不是创建或查找依赖的对象们。 3、面向切面的编程(AOP…

JCIM|Chemistry42:一个人工智能驱动的分子设计和优化平台

题目&#xff1a;Chemistry42: An AI-Driven Platform for Molecular Design and Optimization 文献来源&#xff1a;https://doi.org/10.1021/acs.jcim.2c01191 代码&#xff1a;https://insilico.com/pipeline (平台网址) 1.背景介绍 Chemistry42是Insilico Medicine提出…

Git_合并多次提交记录

Git_合并多次提交记录 前言&#xff1a;使用git rebase将多条提交记录合并成一条 应用场景&#xff1a;公司代码分支在master上&#xff0c;张三接到一个开发任务&#xff0c;需要在master上开发一个新功能&#xff0c;首先张三不能直接使用master分支进行开发&#xff0c;因为…

论文阅读:GeoAug: Data Augmentation for Few-Shot NeRF with Geometry Constrain

中文标题&#xff1a;使用几何约束增强小样本神经辐射场 提出的问题 NeRF尽管简介有效&#xff0c;但是往往不能收敛到正确的几何结构。这个问题在小样本学习中尤为明显&#xff0c;往往在没有足够训练数据的情况下&#xff0c;很难使得MLP网络学习到正确的几何的隐表示&#…

Solon Java Framework 2.1.2 发布。简单!高效!国产!

Solon 是一个高效的 Java 应用开发框架&#xff1a;更快、更小、更简单。它不是 Spring&#xff0c;没有用 Servlet&#xff0c;也无关 JavaEE&#xff1b;它也是一个新兴独立的开放生态。主框架仅 0.1 MB。 150来个生态插件&#xff0c;覆盖各种不同的应用开发场景&#xff1…

Linux Capabilities 入门

目录 Linux capabilities 是什么&#xff1f; capabilities 的赋予和继承 线程的 capabilities Permitted Effective Inheritable Bounding Ambient 文件的 capabilities Permitted Inheritable Effective 运行 execve() 后 capabilities 的变化 案例 Linux capab…

黑马】后台管理183-

一、添加时间线组件时间线组件在element2.6.0的版本中才可以找到项目中用到的插件早于时间线插件发布的&#xff0c;所以需要用到素材中的&#xff0c;timeline 和timeline-item复制到\code\shop-hou\src\plugins\1,在element.js中导入timeline等组件import Timeline from ./ti…

20230213在AIO-3568J开发板在原厂Android12下跑通ap6275s

20230213在AIO-3568J开发板在原厂Android12下跑通ap6275s 2023/2/13 8:59 一、从AIO-3568的Android11的kernel中抠出来AP6275S的驱动&#xff1a; 1、 Z:\android12-rk3588-new\kernel-4.19\arch\arm64\configs\rockchip_defconfig # CONFIG_WLAN_VENDOR_QUANTENNA is not set …

电路中的过压(OVP)过流(OCP)保护电路

电路中的过压(OVP)过流(OCP)保护电路 我们在学习电路设计的过程中,总会发现电路在过压或者过流时遭到不可逆的损坏, 下面分享几例过压过流保护电路, 希望对朋友们有所帮助, 个人能力有限, 如有不当之处还请多多指教: 例 1&#xff1a;OVP(过压保护) 1).当VCC_IN小于28V时&…

spring(三)-----------什么是beanDefinition?

上篇我们以mybatis如何注入mapper对象为引&#xff0c;发现mybatis使用了FactoryBean&#xff08;动态代理&#xff09;动态注册beanDefinition 的方式实现了对多个bean进行注入。 这篇我们延续上篇的问题&#xff0c;什么是beanDefinition&#xff1f;动态注入beanDefinition…

yum安装

仓库安装[rootlocalhost ~]# rpm -ivh https://repo.mysql.com//mysql80-community-release-el9-1.noarch.rpm[roothezhihao ~]# dnf install mysql-server -y本地安装wget https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.32-1.el9.x86_64.rpm-bundle.tartar xvf mysql…

STK + C# + Cesium联合编程(二):CZML文件生成及加载

概述本文续上一篇博文&#xff0c;上一篇文章中验证了C# .NET Framework (Web Service) STK Cesium前端显示的相关技术&#xff0c;本篇通过STK安装附带的Pro Tutorial实例以及Export CZML插件演示如何创建STK场景&#xff0c;创建对象&#xff0c;计算Access&#xff0c;并通…