react-09React生命周期

1.react生命周期(舊版)

1.1react初始掛載時的生命周期

1:構造器-constructor

 // 構造器constructor(props) {console.log('1:構造器-constructor');super(props)// 初始化狀態this.state = {count: 0}}

?2:組件將要掛載-componentWillMount

 // 組件將要掛載componentWillMount() {console.log('2:組件將要掛載-componentWillMount');}

3:開始渲染-render

render(){console.log('3:開始渲染-render');const {count} = this.statereturn(<div><h2>當前的和為{count}</h2><button onClick={this.add}>點我+1</button><button onClick={this.death}>卸載DOM</button></div>)}

?4:組件掛載完成-componentDidMount

// 組件掛載完成componentDidMount() {console.log('4:組件掛載完成-componentDidMount');}

?5:組件卸載-componentWillUnmount

// 組件卸載componentWillUnmount() {console.log('5:組件卸載-componentWillUnmount');}

代碼實現演示

點擊卸載dom后?

?整體代碼

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Hello,React生命周期(舊)</title>
</head><body><!-- 容器 --><div id="test"></div><!-- {/* // 引入 React核心庫 */} --><script src="https://unpkg.com/react@16/umd/react.production.min.js"></script><!-- {/* // 引入 react-dom 用于支持 react 操作 DOM */} --><script src="https://unpkg.com/react-dom@16/umd/react-dom.production.min.js"></script><!-- {/* // 引入 babel:1. ES6 ==> ES5 2. jsx ==> js */} --><script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script><!-- {/* // 引入 JSX 語法 */} --><script type="text/babel">// 1. 創建組件class Count extends React.Component {// 構造器constructor(props) {console.log('1:構造器-constructor');super(props)// 初始化狀態this.state = {count: 0}}add=()=>{// 獲取原狀態const {count} = this.state// 狀態更新this.setState({count: count+1})}death=()=>{ReactDOM.unmountComponentAtNode(document.getElementById('test'))}// 組件將要掛載componentWillMount() {console.log('2:組件將要掛載-componentWillMount');}// 組件掛載完成componentDidMount() {console.log('4:組件掛載完成-componentDidMount');}// 組件卸載componentWillUnmount() {console.log('5:組件卸載-componentWillUnmount');}render(){console.log('3:開始渲染-render');const {count} = this.statereturn(<div><h2>當前的和為{count}</h2><button onClick={this.add}>點我+1</button><button onClick={this.death}>卸載DOM</button></div>)}}ReactDOM.render(<Count />,document.getElementById('test'))</script>
</body></html>
?1.2.react更新數據setState

1:shouldComponentUpdate-判斷是否需要更新

// 控制組件更新 默認不寫此鉤子函數 返回true 組件更新shouldComponentUpdate(nextProps, nextState) {   console.log('1:shouldComponentUpdate-判斷是否需要更新');return true}

2:componentWillUpdate-組件將要更新

// 組件將要更新componentWillUpdate(nextProps, nextState) {console.log('2:componentWillUpdate-組件將要更新');}

3:開始渲染-render

 render(){console.log('3:開始渲染-render');const {count} = this.statereturn(<div><h2>當前的和為{count}</h2><button onClick={this.add}>點我+1</button><button onClick={this.death}>卸載DOM</button></div>)}

?4:componentDidUpdate-組件更新完成

// 組件更新完成componentDidUpdate(prevProps, prevState) {console.log('4:componentDidUpdate-組件更新完成');}

5:組件卸載-componentWillUnmount

// 組件卸載componentWillUnmount() {console.log('5:組件卸載-componentWillUnmount');}

整體代碼?

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Hello,React生命周期(舊)</title>
</head><body><!-- 容器 --><div id="test"></div><!-- {/* // 引入 React核心庫 */} --><script src="https://unpkg.com/react@16/umd/react.production.min.js"></script><!-- {/* // 引入 react-dom 用于支持 react 操作 DOM */} --><script src="https://unpkg.com/react-dom@16/umd/react-dom.production.min.js"></script><!-- {/* // 引入 babel:1. ES6 ==> ES5 2. jsx ==> js */} --><script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script><!-- {/* // 引入 JSX 語法 */} --><script type="text/babel">// 1. 創建組件class Count extends React.Component {state = {count: 0}add=()=>{// 獲取原狀態const {count} = this.state// 狀態更新this.setState({count: count+1})}death=()=>{ReactDOM.unmountComponentAtNode(document.getElementById('test'))}// 組件卸載componentWillUnmount() {console.log('5:組件卸載-componentWillUnmount');}// 控制組件更新 默認不寫此鉤子函數 返回true 組件更新shouldComponentUpdate(nextProps, nextState) {   console.log('1:shouldComponentUpdate-判斷是否需要更新');return true}// 組件將要更新componentWillUpdate(nextProps, nextState) {console.log('2:componentWillUpdate-組件將要更新');}// 組件更新完成componentDidUpdate(prevProps, prevState) {console.log('4:componentDidUpdate-組件更新完成');}render(){console.log('3:開始渲染-render');const {count} = this.statereturn(<div><h2>當前的和為{count}</h2><button onClick={this.add}>點我+1</button><button onClick={this.death}>卸載DOM</button></div>)}}ReactDOM.render(<Count />,document.getElementById('test'))</script>
</body></html>
1.3.forceUpdate聲明周期函數強制刷新

forceUpdate--》componentWillUpdate--》render--》componentDidUpdate--》componentWillUnmount

1.4父組件調用子組件render生命周期

componentWillReceiveProps--生命周期鉤子函數---父組件調用子組件 第二次渲染,其他的調用子組件的生命周期如setState以后執行生命周期一致。

父組件A

 // 創建組件A--父組件class A extends React.Component {// 初始化狀態state={carName:'奧迪'}// 事件changeCarName=()=>{ this.setState({carName: '寶馬'})}render() {return (<div><div>A組件</div><button onClick={this.changeCarName}>修改車名</button>{/*將修改的車名傳遞給子組件--B*/}<B carName={this.state.carName} /></div>)}}

子組件B

 // 創建組件B--子組件class B extends React.Component {// 生命周期鉤子函數---父組件調用子組件 第二次渲染componentWillReceiveProps() {console.log('b--componentWillReceiveProps');}render() {return (// B--props 接收父組件傳遞的props<div>B組件,接收父組件傳遞的props:{this.props.carName}</div>)}}
1.5 舊版生命周期總結?

????????

基礎開發中常用的生命周期鉤子:

  • componentDidMount:初始化做的事情,開啟定時器,發送網絡請求,訂閱消息。
  • render:渲染結構。
  • componentWillUnmount:收尾,關閉定時器,取消消息。

2.react生命周期(17)

componentWillMount,componentWillReceiveProps,componentWillUpdate,在新的react17上中要加前綴UNSAFE。

2.1getDerivedStateFromProps靜態生命周期方法(使用頻率少)

????????允許組件在渲染前根據?props?的變化更新其內部狀態。它在?render()?方法之前被調用,主要用于處理那些狀態依賴于?props?變化的罕見場景。

1.注意

無法訪問?this(即組件實例)

2.調用時機

組件首次掛載時(類似于?constructor

props?更新時(父組件重新渲染或?props?發生變化)

強制更新時(this.forceUpdate()

3.返回值

必須返回一個對象來更新狀態,或返回?null?表示不更新狀態

返回的新狀態對象會與現有狀態合并

4.使用場景:

罕見情況下,狀態需要依賴于?props?的變化(例如,跟蹤先前的?props?值)。

當?props?變化時重置狀態(例如,父組件傳遞的?prop?變化時清空表單輸入)。

5.代碼展示:

class Example extends React.Component {state = {derivedValue: 0,prevValue: 0, // 用于存儲先前的 prop 值};static getDerivedStateFromProps(nextProps, prevState) {// 僅在 props.value 變化時更新狀態if (nextProps.value !== prevState.prevValue) {return {derivedValue: nextProps.value * 2, // 根據 prop 推導狀態prevValue: nextProps.value, // 更新存儲的先前 prop 值};}return null; // 無變化時不更新狀態}render() {return <div>Derived Value: {this.state.derivedValue}</div>;}
}
2.2?getSnapshotBeforeUpdate?(組件更新前捕獲當前信息-DOM狀態)

? ? ? ? 主要用于組件更新前捕獲當前信息,并將信息傳遞給componentDidUpdate,便于更新后進行對應的調整,

調用時機:在render后,DOM更新前:調用時機介于render與componentDidUpdate間。

接收參數:接收兩個參數,prevProps(更新前的props),prevState(更新前的state)。

使用場景:捕獲DOM狀態(列表更新,捕獲滾動位置,更新后恢復滾動位置)。

componentDidUpdate配合使用:getSnapShotBeforeUpdate返回值作為它的第三個參數(snapshot)傳遞。在其中根據snapshot的值進行對應的操作。

使用getSnapShotBeforeUpdate保持滾動位置不變:

import React from 'react';class ScrollingList extends React.Component {constructor(props) {super(props);this.listRef = React.createRef();this.state = {items: ['Item 1', 'Item 2', 'Item 3'],};}componentDidMount() {setInterval(() => {this.setState(prevState => ({items: [`New Item ${prevState.items.length + 1}`, ...prevState.items],}));}, 1000);}getSnapshotBeforeUpdate(prevProps, prevState) {// 捕獲更新前的滾動位置if (prevState.items.length < this.state.items.length) {const list = this.listRef.current;return list.scrollHeight - list.scrollTop;}return null;}componentDidUpdate(prevProps, prevState, snapshot) {// 根據快照調整滾動位置if (snapshot !== null) {const list = this.listRef.current;list.scrollTop = list.scrollHeight - snapshot;}}render() {return (<divref={this.listRef}style={{ height: '100px', overflow: 'auto', border: '1px solid black' }}>{this.state.items.map((item, index) => (<div key={index}>{item}</div>))}</div>);}
}export default ScrollingList;
?2.3總結

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

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

相關文章

【NVM】管理不同版本的node.js

目錄 一、下載nvm 二、安裝nvm 三、驗證安裝 四、配置下載鏡像 五、使用NVM 前言&#xff1a;不同的node.js版本會讓你在使用過程很費勁&#xff0c;nvm是一個node版本管理工具&#xff0c;通過它可以安裝多種node版本并且可以快速、簡單的切換node版本。 一、下載nvm htt…

八大排序——冒泡排序/歸并排序

八大排序——冒泡排序/歸并排序 一、冒泡排序 1.1 冒泡排序 1.2 冒泡排序優化 二、歸并排序 1.1 歸并排序&#xff08;遞歸&#xff09; 1.2 遞歸排序&#xff08;非遞歸&#xff09; 一、冒泡排序 1.1 冒泡排序 比較相鄰的元素。如果第一個比第二個大&#xff0c;就交換…

區塊鏈隨學隨記

前情提要&#xff1a;本人技術棧為ganachehardhatpython ganache提供的是本地的區塊鏈環境&#xff0c;相當于模擬以太坊&#xff0c;這樣可以允許多個賬戶在本機交互。hardhat和remix都是區塊鏈ide&#xff0c;用于編寫和部署合約助記詞有個數規定&#xff0c;只有滿足這些個數…

Android原生開發基礎

Android實戰 Android 原生開發基礎 知識點1 介紹了解2 系統體系架構3 四大應用組件4 移動操作系統優缺點5 開發工具6 配置工具7 下載相關資源8JDK下載安裝流程9配置好SDK和JDK環境10 第一個Hello word11 AS開發前常用設置12模擬器使用運行13 真機調試14 AndroidUI基礎布局15 加…

網頁版 deepseek 對話問答內容導出為 PDF 文件和 Word 文件的瀏覽器插件下載安裝和使用說明

文章目錄 網頁版 deepseek 瀏覽器擴展應用程序插件1. 預覽效果2. 功能介紹3. 瀏覽器擴展應用程序下載3.1. 下載方式13.2. 下載方式24. 安裝教程4.1. Chrome 瀏覽器安裝步驟4.2. Edge 瀏覽器安裝步驟5. 使用說明網頁版 deepseek 瀏覽器擴展應用程序插件 1. 預覽效果 預覽效果 導…

DBdriver使用taos數據庫

首先創建連接 連接后比如數據庫里有三個庫 選擇其中的hypon 選中localhost&#xff0c;右鍵sql編輯器&#xff0c;打開sql控制臺 就插入了一條數據

【前端】【面試】如何實現圖片漸進式加載?有幾種方法

前端圖片漸進式加載 一、技術原理解析 漸進式加載是通過分階段、按需加載圖片&#xff0c;以提升用戶體驗和頁面性能的優化技術。主要包括以下實現方式&#xff1a; 懶加載&#xff1a;基于IntersectionObserver API&#xff0c;當圖片進入瀏覽器視口時才發起加載請求&#…

Spring Boot 中的條件注解

Spring Boot條件注解的匯總&#xff1a; 注解作用判斷依據使用場景ConditionalOnBean容器中存在指定Bean時&#xff0c;被注解的配置或Bean定義生效指定Bean在容器中存在依賴其他已存在Bean時配置相關功能ConditionalOnCheckpointRestore在特定檢查點恢復相關條件滿足時生效滿…

leetcode11-盛水最多的容器

leetcode 11 思路 問題分析 拆解問題&#xff0c;面積 底 * 高 寬度&#xff1a;兩個豎直線之間的距離&#xff0c;顯然是 right - left高度&#xff1a;容器的水位受限于較短的那根豎直線的高度&#xff0c;所以高度為 min(height[left], height[right]) 本題其實很容易…

HTTP:十二.HTTPS

HTTPS 概述 超文本傳輸安全協議(英語:HyperText Transfer Protocol Secure,縮寫:HTTPS;常稱為HTTP over TLS、HTTP over SSL或HTTP Secure)是一種通過計算機網絡進行安全通信的傳輸協議。HTTPS經由HTTP進行通信,利用TLS加密數據包。 HTTPS的主要目的是提供對網站服務器…

MySQL數據庫(14)—— 使用C操作MySQL

目錄 一&#xff0c;下載庫 二&#xff0c;安裝庫 三&#xff0c;使用庫 3.1 連接數據庫 3.2 發送SQL 3.3 獲取結果 問題&#xff1a;為什么不使用C&#xff1f; 解答&#xff1a;使用C的庫已經可以完成絕大部分MySQL操作了&#xff0c;并且C的庫的使用更加復雜&#xff…

Redis故障防御體系:構建七層免疫系統的設計哲學

當Redis遭遇寫入阻塞或服務崩潰時&#xff0c;本質上是系統邊界的多重防御機制被擊穿。本文摒棄碎片化的解決方案&#xff0c;從系統工程的全局視角&#xff0c;構建七層遞進式防御體系&#xff0c;揭示高可用架構的深層設計邏輯。 第一層&#xff1a;動態資源調度 —— 內存的…

在線文本客服系統核心功能解析

在線文本客服系統核心功能解析 在互聯網大廠的Java求職者面試中&#xff0c;經常會被問到關于在線文本客服系統的實現和設計。本文通過一個故事場景來展示這些問題的實際解決方案。 第一輪提問 面試官&#xff1a;馬架構&#xff0c;歡迎來到我們公司的面試現場。請問您對在…

學成在線。。。

一:講師管理 介紹:可以實現對講師的分頁展示,多條件組合分頁查詢,對講師的添加,修改,刪除操作。 針對于添加來說,使用requestBody注解,搭配postmapping接收數據,使用service層的對象,調用mapper方法,向數據庫中保存數據。 修改: 先根據講師id,查詢出講師,再去…

Webug3.0通關筆記17 中級進階(第01-05關)

目錄 第一關 出來點東西吧 1.打開靶場 2.源碼分析 3.源碼修正 4.文件包含漏洞滲透 第二關 提交方式是怎樣的啊&#xff1f; 1.打開靶場 2.源碼分析 3.滲透實戰 &#xff08;1&#xff09;bp改包法 &#xff08;2&#xff09;POST法滲透 第三關 我還是一個注入 1.打開…

C語言復習筆記--內存函數

在復習完字符函數和字符串函數之后,今天讓我們復習一下內存函數吧.這一塊的東西不太多,并且與之前的字符串函數有一些地方很相似,所以這里應該會比較輕松. memcpy使用和模擬實現 老規矩,先看函數原型 void * memcpy ( void * destination, const void * source, size_t num );…

【Unity AR開發插件】一、高效熱更新:Unity AR 插件結合 HybridCLR 與 ARFoundation 的開源倉庫分享

摘要 本篇博客詳細介紹了我基于 HybridCLR 與 AR Foundation 的 Unity AR 開發插件&#xff0c;旨在為開發者提供高效的跨平臺熱更新方案。文章從背景與動機出發&#xff0c;覆蓋一鍵安裝工具、環境配置、熱更新數據制作與示例程序運行等核心模塊&#xff0c;并展示代碼結構與使…

數據分析(四):Python Pandas數據輸入輸出全流程指南

Python Pandas數據輸入輸出全流程指南 1. 引言 數據輸入輸出(I/O)是數據分析工作流中最基礎也是最重要的環節之一。Pandas提供了豐富的數據讀寫接口&#xff0c;支持從各種文件格式和數據庫中加載數據&#xff0c;以及將處理后的數據保存到不同存儲系統中。本文將全面介紹Pan…

人工智能與機器學習:Python從零實現性回歸模型

?? 向所有學習者致敬! “學習不是裝滿一桶水,而是點燃一把火。” —— 葉芝 我的博客主頁: https://lizheng.blog.csdn.net ?? 歡迎點擊加入AI人工智能社區! ?? 讓我們一起努力,共創AI未來! ?? 前言 在 AI 的熱潮中,很容易忽視那些讓它得以實現的基礎數學和技…

Ubuntu18.04更改時區(圖文詳解)

Ubuntu18.04更改時區 1、前言2、更改時區3、總結 1、前言 記錄一下Ubuntu18.04更改時區的過程&#xff0c;方便自己日后回顧&#xff0c;也可以給有需要的人提供幫助。 2、更改時區 輸入下面的指令&#xff0c;進行時區選擇 tzselect輸入4選擇亞洲&#xff0c;輸入9選擇中…