vue2生命周期

前言

vue的生命周期其实可以分为两块,一个是vue实例的生命周期,一个是组件的生命周期。

vue实例的生命周期方法共有4个:$mout,$forceUpdate,$nextTick,$destroy

vue组件的生命周期钩子共有8个:beforeCreate,created,beforeMount,mounted,beforeUpdate,

updated,beforeDestroy,destroyed

以及keep-alive独有的2个生命周期钩子:activated,deactivated

vue实例的生命周期

$mount

给构建vue实例绑定具体的demo节点

必须使用的一个生命周期调用函数,如果你感觉你好像没用他的话,请去看你的入口文件main.js

new Vue({
  render: h => h(App),
}).$mount('#app')

 $forceUpdate

强制刷新当前组件,可以在任何vue组件中使用

这个根据你的业务场景来,比如你的组件很复杂,涉及到大量且比较深的节点嵌套,导致你的视图和数据不一致,就可以使用这个函数去更新当前组件,重新渲染。

这个函数的使用看场景

//直接这么使用就行
this.$forceUpdate()

 $nextTick

在dom完成最后一次渲染之后进行执行的钩子。

这个大家应该不陌生,很多业务场景都能用到,比如请求的数据比较多,并且涉及到视图的修改。比如图片资源等等,就需要使用$nextTick做一个异步的操作。

this.$nextTick(()=>{
 //...视图渲染完成后再执行的逻辑
})

$destroy

手动销毁一个组件。

其实官方也不推荐这么做,因为你要销毁一个组件,要么是路由跳转走了,要么是v-if控制他的销毁。

我至今开发的业务中,也没有遇到什么场景需要我操作这个函数,这里只是说明一下,他会调用组件的 beforeDestory和destory钩子函数。

this.$destroy()

vue组件的生命周期

vue组件的8个生命周期,语义化也很明显,作者给的图也很通俗易懂,形象的很。

生命周期图

beforeCreated

官方说明:在实例初始化之后,进行数据侦听和事件/侦听器的配置之前同步调用。

大白话:组件实例生成了,但是数据,事件,wtach之类属性的还没有加载

created

官方说明:在实例创建完成后被立即同步调用。在这一步中,实例已完成对选项的处理,意味着以下内容已被配置完毕:数据侦听、计算属性、方法、事件/侦听器的回调函数。然而,挂载阶段还没开始,且 $el property 目前尚不可用。

大白话:这个时候你在<script>标签内定义的数据,事件,watch之类的属性那些东西都可以用了,但是<template>里面的节点还不存在

beforeMount

官方说明:在挂载开始之前被调用:相关的 render 函数首次被调用。

大白话:render函数首次被调用,开始解析你的<template>。但是<template>里定义的东西还是没挂载上去,不能访问。

mounted

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

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

大白话:<template>和<style>所创建的视图都挂载完毕,可以访问了。但是不代表你的子组件也完成了所有的渲染,这个看业务,万一有一些复杂的逻辑。如果你想在视图全部渲染完毕,你就在mounted内部使用this.$nextTick(()=>{//业务逻辑}) 

beforeUpdate

官方说明:在数据发生改变后,DOM 被更新之前被调用。这里适合在现有 DOM 将要被更新之前访问它,比如移除手动添加的事件监听器。

大白话:数据改变了,视图没改变

updated

官方说明:在数据更改导致的虚拟 DOM 重新渲染和更新完毕之后被调用。

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

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

大白话:视图更新完成

deforeDestroy

官方说明:实例销毁之前调用。在这一步,实例仍然完全可用。

大白话:数据视图之类的都还在,不过这里是处理一些清除定时器,销毁全局事件总线,或者pubsub接收等操作

destroyed

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

大白话:所有的视图层已经无法操作,但是data数据还在。

代码测试

<template>
  <div>
    <el-input v-model="value" ref="inputRef"></el-input>
  </div>
</template>
<script>
export default {
  name: 'Com1',
  data() {
    return {
      value: '默认值',
    }
  },
  beforeCreate() {
    console.log(this.value, 'beforeCreate钩子内的value')
    console.log(this.$refs.inputRef, 'beforeCreate钩子内的ref节点')
  },
  created() {
    console.log(this.value, 'created钩子内的value')
    console.log(this.$refs.inputRef, 'created钩子内的ref节点value')
  },
  beforeMount() {
    console.log(this.value, 'beforeMount钩子内的value')
    console.log(this.$refs.inputRef, 'beforeMount钩子内的ref节点')
  },
  mounted() {
    console.log(this.value, 'mounted钩子内的value')
    console.log(this.$refs.inputRef, 'mounted钩子内的ref节点value')
  },
  beforeUpdate() {
    console.log(this.value, 'beforeUpdate钩子内的value')
    console.log(this.$refs.inputRef, 'beforeUpdate钩子内的ref节点')
  },
  updated() {
    console.log(this.value, 'updated钩子内的value')
    console.log(this.$refs.inputRef, 'updated钩子内的ref节点')
  },
  beforeDestroy() {
    console.log(this.value, 'beforeDestroy钩子内的value')
    console.log(this.$refs.inputRef, 'beforeDestroy钩子内的ref节点')
  },
  destroyed() {
    console.log(this.value, 'destroyed钩子内的value')
    console.log(this.$refs.inputRef, 'destroyed钩子内的ref节点')
  },
  methods: {
    handler() {

    },
  }


}
</script>

初始化渲染的结果

 修改输入框的值

 切换到其他组件

 

 简单总结如下

beforeCreated组件实例生成,但数据和事件,watch等无法使用
createddata和methods等等可以使用,此阶段可以调用http接口
beforeMount初次调用render函数,模板开始编译,但是没有生成
mounted数据,事件,watch和视图都已挂载完毕,但是不能保证所有子组件都渲染完毕
beforeUpdate数据改变,但视图未改变
updated视图随视图改变也改变
deforeDestroy组件销毁前,数据,视图,属性等都可以正常操作,可以销毁一些定时器和监听
destroyed 数据虽然在,但是视图,watch,事件等属性的已销毁

 父子组件生命周期

这个东西在开发中还是很重要的,如果你要是将逻辑写错了地方,就会出错

初始化渲染

父beforeCreate->父created->父beforeMount->子beforeCreate->子created->子beforeMount->子mounted->父mounted

子组件更新

父beforeUpdate->子beforeUpdate->子updated->父updated

父组件更新

父beforeUpdate->父updated

销毁

父beforeDestroy->子beforeDestroy->子destroyed->父destroyed

keep-alive缓存组件特有的生命周期

activated

keep-alive缓存的组件激活时触发的钩子函数

deactivated

keep-alive缓存的组件失活时触发的钩子函数

    activated(){
        console.log('缓存组件激活时调用')
        },
    deactivated(){
        console.log('缓存组件失活时调用')
    },

 感觉有用的给个赞吧!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Element UI的Tabs 标签页位置导航栏去除线条

在实际开发中&#xff0c;我们调整了相关样式&#xff0c;导致导航栏的相关样式跟随不上&#xff0c;如下图所示&#xff1a; 因为我跳转了前边文字的样式并以在导航栏添加了相关头像&#xff0c;导致右边的线条定位出现问题&#xff0c;我在想&#xff0c;要不我继续调整右边…

抖音汽车租赁小程序技术指南:开发高效便捷的租赁系统

为了更好地满足用户需求&#xff0c;抖音汽车租赁小程序成为一个备受关注的技术解决方案。本文将深入探讨开发高效便捷的汽车租赁系统所需的技术要点&#xff0c;为开发者提供一份实用的技术指南。 小程序架构选择 在搭建抖音汽车租赁小程序时&#xff0c;选择合适的小程序架构…

TIDB拓扑结构

TiDB Server&#xff1a;SQL层&#xff0c;负责接受客户端的连接&#xff0c;执行SQL解析和优化&#xff0c;最终生成分布式执行计划。TiDB Server为无状态的&#xff0c;可增加节点负载均衡。 PD (Placement Driver) Server&#xff1a;整个TiDB集群的元信息管理模块&#xf…

露营管理系统预约小程序效果如何

旅游经济已经复苏&#xff0c;并且市场规模增速加快&#xff0c;近一年来远途/周边游客户增多&#xff0c;不少旅游景区在节假日常常面对客流爆满现象。同时露营作为近几年突然火热的项目&#xff0c;其需求也是日渐上升。 然而在高需求的同时&#xff0c;我们也看到露营经营痛…

修改QtCreator/QDesigner的对象指示器高亮颜色

一、前言 QtCreator的设计中&#xff0c;高亮颜色太接近了&#xff0c;在左边点一个对象后&#xff0c;很难在右边对上&#xff0c;体验极差。 二、解决方案 创建一份style.qss&#xff0c;写入以下的样式&#xff1a; /* for QtCreator */ QDockWidget #ObjectInspector …

线上问题排查实例分析|关于 Redis 内存泄漏

Redis 作为高性能的 key-value 内存型数据库&#xff0c;普遍使用在对性能要求较高的系统中&#xff0c;同时也是滴滴内部的内存使用大户。本文从 KV 团队对线上 Redis 内存泄漏定位的时间线维度&#xff0c;简要介绍 Linux 上内存泄漏的问题定位思路和工具。 16:30 问题暴露 业…

快来考试拿证书!KubeSphere 个人技能专业考试认证上线啦!

以容器技术和容器编排为基础的云原生应用&#xff0c;被越来越多的企业用户接受和使用&#xff0c;并且在生产环境中使用容器技术的比例逐年增加。Kubernetes 无疑已经成为容器编排的事实基础&#xff0c;而依托于 Kubernetes 开发的开源容器平台 KubeSphere 也收获了一众拥趸。…

群晖NAS搭建WebDav服务做文件共享,可随时随地远程访问

文章目录 1. 在群晖套件中心安装WebDav Server套件1.1 安装完成后&#xff0c;启动webdav服务&#xff0c;并勾选HTTP复选框 2. 局域网测试WebDav服务2.1 下载RaiDrive客户端2.2 打开RaiDrive&#xff0c;设置界面语言可以选择中文2.3 点击添加按钮&#xff0c;新建虚拟驱动区2…

论文《Unsupervised Dialog Structure Learning》笔记:详解DD-VRNN

D-VRNN模型和DD-VRNN模型 总体架构 离散-可变循环变分自编码器&#xff08;D-VRNN&#xff09;和直接-离散-可变循环变分自编码器&#xff08;DD-VRNN&#xff09;概述。D-VRNN和DD-VRNN使用不同的先验分布来建模 z t z_t zt​之间的转换&#xff0c;如红色实线所示。 x t x_t…

【Effective C++】 (六) 继承与面向对象设计

【六】继承与面向对象设计 条款32 &#xff1a; 确保public继承是"is a"的关系 Item 32: Make sure public inheritance models “is-a”. C面向对象程序设计中&#xff0c;最重要的规则便是&#xff1a;public继承应当是"is-a"的关系。当Derived public继…

设计师不能忽视的几个宝藏图标设计工具

在这个快速变化的时代&#xff0c;设计师对创新和实用工具的需求越来越大。这就要求我们及时跟上潮流&#xff0c;不断探索和尝试最新、最有价值的图标设计工具。只有这样&#xff0c;我们才能在竞争激烈的设计市场中脱颖而出。以下是我们精心挑选的2024年值得一试的图标设计工…

Linux C++ 服务器端这条线怎么走?一年半能做出什么?

Linux C 服务器端这条线怎么走&#xff1f;一年半能做出什么&#xff1f; 既然你是在校学生&#xff0c;而且编程语言和数据结构的基础还不错&#xff0c;我认为应该在《操作系统》和《计算机体系结构》这两门课上下功夫&#xff0c;然后才去读编程方面的 APUE、UNP 等书。 最…

ffmpeg播放器实战(播放器流程)

1.流程图 1.main窗口创建程序窗口 程序窗口构造函数执行下面内容 2.开启播放 3.开启解码 4.开启渲染 5.反馈给ui 本文福利&#xff0c; 免费领取C音视频学习资料包学习路线大纲、技术视频/代码&#xff0c;内容包括&#xff08;音视频开发&#xff0c;面试题&#xff0c;FFmpeg…

vue中怎么根据选择的名称 生成印章图片

项目中需要根据选择的印章名称&#xff0c;动态生成印章 &#xff0c;印章下方显示当前的日期 代码如下 <template><div><label for"name">选择名称&#xff1a;</label><select id"name" v-model"selectedName">…

virtualbox 扩展磁盘后在win10 虚拟机看不到新扩展的空间

造成标题中问题的原因是&#xff0c;扩展的是win10.vdi 的空间&#xff0c;虚拟机使用使用的下边那个以uuid命名的空间&#xff0c;将这个磁盘的虚拟分配空间也调整到150G . 然后在win10的磁盘管理里就可以看到新加的空间了。之后再点相应的盘进行扩展卷操作即可。

Android跨进程传图片或者大数据(解决TransactionTooLargeException)

跨进程传图片方案 直接intent传bitmap使用文件读写intent传递自定义binder&#xff0c;binder中传递image使用网络传输 一、直接intent传bitmap 优势 使用简单 劣势 相关代码可能有侵入性&#xff0c;必须在四大组件中接收。 intent传递数据的总大小是1MB&#xff0c;其中…

SA实战 ·《SpringCloud Alibaba实战》第14章-服务网关加餐:SpringCloud Gateway核心技术

大家好,我是冰河~~ 一不小心《SpringCloud Alibaba实战》专栏都更新到第14章了,再不上车就跟不上了,小伙伴们快跟上啊! 在《SpringCloud Alibaba实战》专栏前面的文章中,我们实现了用户微服务、商品微服务和订单微服务之间的远程调用,并且实现了服务调用的负载均衡。也基…

geemap学习笔记012:如何搜索Earth Engine Python脚本

前言 本节主要是介绍如何查询Earth Engine中已经集成好的Python脚本案例。 1 导入库 !pip install geemap #安装geemap库 import ee import geemap2 搜索Earth Engine Python脚本 很简单&#xff0c;只需要一行代码。 geemap.ee_search()使用方法 后记 大家如果有问题需…

前端处理返回数据为数组对象且对象嵌套数组并重名的数据,合并名称并叠加数据

前端处理返回数据为数组对象且对象嵌套数组并重名的数据&#xff0c;合并名称并叠加数据 var newList[]; var table{}; var dataObj{}; var finalList[]; var tableData[{brName:营业部,dateStr:2023-11-23,tacheArr:[{dealCnt:20,tacheName:奔驰}]},{brName:营业部,dateStr:2…

想自学软件测试?一般人我还是劝你算了吧。。。

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…