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('緩存組件失活時調用')},

?感覺有用的給個贊吧!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/165299.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/165299.shtml
英文地址,請注明出處:http://en.pswp.cn/news/165299.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C/C++小寫字母的判斷 2022年3月電子學會中小學生軟件編程(C/C++)等級考試一級真題答案解析

目錄 C/C小寫字母的判斷 一、題目要求 1、編程實現 2、輸入輸出 二、算法分析 三、程序編寫 四、程序說明 五、運行結果 六、考點分析 C/C小寫字母的判斷 2022年3月 C/C編程等級考試一級編程題 一、題目要求 1、編程實現 輸入一個字符&#xff0c;判斷是否是英文小…

iframe內部子頁面與外部主頁面通訊

文章目錄 一、問題二、解決2.1、子頁面2.2、主頁面 三、知識點3.1、[瀏覽器兼容性](https://developer.mozilla.org/zh-CN/docs/Web/API/Window/postMessage#%E6%B5%8F%E8%A7%88%E5%99%A8%E5%85%BC%E5%AE%B9%E6%80%A7)3.2、詳解3.2.1、發送方3.2.2、接收方 一、問題 如上所示&a…

被刪數據庫+勒索

被刪數據庫勒索 – WhiteNights Site 標簽&#xff1a;日志 快照在手&#xff0c;天下我有 服務器又給人黑了。這次是給人黑了數據庫&#xff0c;被人刪庫勒索&#xff0c;先放圖吧。我還花了今天一個下午的時間查修這個漏洞&#xff0c;導致網站有接近6個小時都沒法訪問。 …

編程示例: Session Id的生成

實現思路 Session的實現方式如下&#xff1a;在用戶第一次登錄的時候&#xff0c;系統為它分配一個唯一Id(被稱為Session Id)作為標識&#xff0c;并且 記錄下這個用戶的用戶名、要登錄的賬套名、用戶擁有的權限等&#xff0c;以Id為鍵&#xff0c;用戶名、賬套名等信息為值保…

云原生Kubernetes系列 | Kubernetes靜態Pod的使用

云原生Kubernetes系列 | Kubernetes靜態Pod的使用 靜態pod不建議在master上操作,因為master上跑的是集群核心靜態pod,如果配置失敗,會導致集群故障。建議在knode1或knode2上去做。 kubernetes master節點上的核心組件pod其實都是靜態pod: [root@k8s-master ~]# ls /etc/ku…

java中鎖的使用-實戰

技術主題 技術原理 在實際的業務中,為了保證線程安全,會進行對一些邏輯進行加鎖,保證當前只有一個線程在操作。在代碼中,我們經常使用兩種方式進行加鎖,來保證線程安全。一種是synchronized關鍵字,另一種是ReentrantLock加鎖。寫這一份的博客,就是為了記錄下鎖的基本使…

五分鐘,Docker安裝flink,并使用flinksql消費kafka數據

1、拉取flink鏡像&#xff0c;創建網絡 docker pull flink docker network create flink-network2、創建 jobmanager # 創建 JobManager docker run \-itd \--namejobmanager \--publish 8081:8081 \--network flink-network \--env FLINK_PROPERTIES"jobmanager.rpc.ad…

Redis 命令行 redis-cli 介紹

文章目錄 前言1. 連接 Redis 服務2. 從其他程序獲取輸入3. 連續執行相同的命令4. CSV 輸出5. 輸出幫助信息6. 清空屏幕7. 連續監控統計信息8. 輸出大 key 報告9. 監控 Redis 執行的命令 前言 redis-cli 是 Redis 自帶的命令行工具&#xff0c;是運維和開發人員常用的工具&…

【C++干貨鋪】適配器 | stack | queue

個人主頁點擊直達&#xff1a;小白不是程序媛 C系列學習專欄&#xff1a;C干貨鋪 代碼倉庫&#xff1a;Gitee 目錄 stack的介紹和使用 stack的介紹 stack的使用 queue的介紹和使用 queue的介紹 queue的使用 容器適配器 什么是適配器 STL中stack和queue的底層結構 d…

Doris擴容和縮容(六)

Doris 可以很方便的擴容和縮容 FE、BE、Broker 實例。 FE 擴容和縮容 可以通過將 FE 擴容至 3 個以上節點來實現 FE 的高可用。 1&#xff09;使用 MySQL 登錄客戶端后&#xff0c;可以使用 sql 命令查看 FE 狀態&#xff0c;目前就一臺 FE mysql -h hadoop1 -P 9030 -uroo…

Python——基于YOLOV8的車牌識別(源碼+教程)

目錄 一、前言 二 、完成效果 三、 項目包 四、運行項目 &#xff08;教程&#xff09; 一、前言 YOLOv8LPRNet車牌定位與識別https://www.bilibili.com/video/BV1vk4y1E7MZ/ 最近做了有一個車牌識別的小需求&#xff0c;今天完成了&#xff0c;在此記錄和分享 首先&#x…

辦公技巧:Word中插入圖片、形狀、文本框排版技巧

目錄 一、插入圖片排版技巧 二、添加形狀排版技巧 三、插入“文本框”排版技巧 我們平常在制作word時候經常會遇到插入選項卡下的圖片、形狀和文本框這三種情況下&#xff0c;那么如何使得Word文檔當中添加這三個元素的同時&#xff0c;又能保證樣式美觀呢&#xff0c;今天小…

ComfyUI搭建使用教程

ComfyUI 是一個基于節點流程式的stable diffusion AI 繪圖工具WebUI&#xff0c; 你可以把它想象成集成了stable diffusion功能的substance designer&#xff0c; 通過將stable diffusion的流程拆分成節點&#xff0c;實現了更加精準的工作流定制和完善的可復現性。但節點式的工…

【分布式】分布式事務及其解決方案

目錄 一、分布式事務二、分布式事務的解決方案1. 全局事務&#xff08;1&#xff09;DTP模型&#xff08;2&#xff09; 兩階段提交協議&#xff08;2PC&#xff09;原理二階段提交的缺點 &#xff08;3&#xff09;三階段提交協議&#xff08;3PC&#xff09;原理 2. 基于可靠…

【算法】搭配購買(01背包,加權并查集)

題目 Joe覺得云朵很美&#xff0c;決定去山上的商店買一些云朵。 商店里有 n 朵云&#xff0c;云朵被編號為 1,2,…,n&#xff0c;并且每朵云都有一個價值。 但是商店老板跟他說&#xff0c;一些云朵要搭配來買才好&#xff0c;所以買一朵云則與這朵云有搭配的云都要買。 …

DDoS攻擊和CC攻擊有什么不同之處?

DDoS是針對服務器IP發起&#xff0c;CC攻擊針對的是業務端口。DDoS攻擊打的是網站的服務器&#xff0c;而CC攻擊是針對網站的頁面攻擊&#xff0c;用術語來說就是&#xff0c;一個是WEB網絡層拒絕服務攻擊&#xff08;DDoS&#xff09;&#xff0c;一個是WEB應用層拒絕服務攻擊…

Linux添加環境變量$PATH

變量$PATH 查看環境變量 [rootlocalhost lnserver]# echo $PATH /usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/root/bin由于沒有docker路徑的環境變量&#xff0c;docker命令使用無效 要將腳本添加到 PATH 中&#xff0c;以便無論在哪個目錄中都可以調用它或執行它&…

【鏈路追蹤】xxl-job定時任務日志增加traceId

問題背景 項目中通過sleuth實現了統一的traceId注入&#xff0c;在生產環境進行日志追溯時比較方便。但是在使用xxl-job進行定時任務管理時&#xff0c;卻發現xxl-job線程打印出來的日志沒有traceId&#xff0c;查詢日志時十分不方便&#xff0c;于是通過使用Spring aop的方式…

點云從入門到精通技術詳解100篇-基于深度學習的稀疏點云障礙物檢測

目錄 前言 國內外研究現狀 激光雷達點云配準 激光雷達目標檢測

c#代碼Linq中使用OrderBy進行自定義排序

c#代碼Linq中使用OrderBy進行自定義排序 /// <summary>/// 自定義字符串比較器 用于自定義排序/// </summary>public class StringComparer : IComparer<string>{/// <summary>/// 偏好的排序列表/// </summary>public List<string> _pre…