react Hooks之useLayoutEffect和useInsertionEffect

在介紹這兩個hooks之前。讓我們先對比一下useEffect、useLayoutEffect、useInsertionEffect

  1. 執行時機

    • useEffect?在組件渲染完成后執行,屬于異步執行。
    • useInsertionEffect?在組件渲染并插入 DOM 后執行,也屬于異步執行。
    • useLayoutEffect?在組件渲染完成后立即同步執行,并在瀏覽器布局和繪制之前運行。
  2. 對 DOM 元素的訪問

    • 使用?useEffect?時,無法直接訪問具體的 DOM 元素。
    • 使用?useInsertionEffect?時,可以通過傳遞 ref 引用來獲取對特定 DOM 元素的引用,并在回調函數中進行操作。
    • 使用?useLayoutEffect?時,也可以通過 ref 獲取對 DOM 元素的引用,并在組件渲染完成后立即同步執行副作用操作。
  3. 影響瀏覽器渲染的時機

    • useEffect?和?useInsertionEffect?的執行時機都是在瀏覽器渲染之后,不會阻塞頁面的渲染過程。
    • useLayoutEffect?的執行是同步的,并且在瀏覽器布局和繪制之前運行,因此如果其中的副作用操作比較耗時,可能會阻塞瀏覽器的渲染過程,導致用戶界面的卡頓

一、useLayoutEffect

1、作用:

它在組件完成渲染后同步執行副作用操作,并在瀏覽器布局和繪制之前運行。它與 useEffect 的使用方式類似,但在執行時機上有所不同。

具體來說,useLayoutEffect 的執行時機如下:

  1. 在組件渲染完成后立即執行。
  2. 在瀏覽器執行布局和繪制之前運行,以確保在瀏覽器更新屏幕之前執行副作用操作。

這意味著 useLayoutEffect 會在 DOM 更新之后、瀏覽器繪制之前同步執行,使得其副作用操作能夠立即對 DOM 進行更改,而這些更改可能會影響到瀏覽器的布局和繪制。

2、注意事項

由于 useLayoutEffect 的執行是同步的,如果其中的副作用操作比較耗時,會阻塞瀏覽器的渲染過程,導致用戶界面的卡頓。因此,在使用 useLayoutEffect 時,應該謹慎處理副作用操作的性能問題。

3、用法:同useEffect類似,一個回調函數,一個依賴項。

4、示例

import { useLayoutEffect, useRef } from 'react';function Example() {const ref = useRef(null);const [count, setCount] = useState(0);useLayoutEffect(() => {console.log('useLayoutEffect - Component rendered:', ref.current);ref.current.style.backgroundColor = 'red';return () => {console.log('useLayoutEffect cleanup');};}, [count]);return (<div><div ref={ref}>Hello World</div><button onClick={() => setCount(count + 1)}>Click me</button></div>);
}

在這個例子中,我們創建了一個 ref 引用,用于訪問 DOM 元素。在 useLayoutEffect 的回調函數中,我們可以通過 ref.current 獲取到對應的 <div> 元素,并設置其背景顏色為紅色。此外,我們還在 deps 參數中傳遞了 count 狀態,表示只有當 count 發生變化時才執行副作用操作。

二、useInsertionEffect

1、作用

它用于在組件渲染并插入 DOM 后執行副作用操作。與 useEffectuseLayoutEffect 不同,useInsertionEffect 的回調函數會在瀏覽器完成對 DOM 元素的插入操作后才運行。

2、用法

和useEffect類似,不具體說明

3、注意事項:

由于 useInsertionEffect 的回調函數是在瀏覽器完成對 DOM 元素的插入操作后才運行,因此可以在其中直接訪問具體的 DOM 元素。這與 useEffectuseLayoutEffect 不同,它們無法直接訪問具體的 DOM 元素。因此,在處理需要訪問具體 DOM 元素的副作用操作時,可以優先考慮使用 useInsertionEffect

4、示例:

import { useInsertionEffect, useRef } from 'react';function Example() {const ref = useRef(null);const [count, setCount] = useState(0);useInsertionEffect(() => {console.log('useInsertionEffect - Component inserted:', ref.current);ref.current.style.backgroundColor = 'red';return () => {console.log('useInsertionEffect cleanup');};}, [count]);return (<div><button onClick={() => setCount(count + 1)}>Click me</button><div ref={ref}>Hello World</div></div>);
}

在這個例子中,我們創建了一個 ref 引用,用于訪問 DOM 元素。在 useInsertionEffect 的回調函數中,我們可以通過 ref.current 獲取到對應的 <div> 元素,并設置其背景顏色為紅色。此外,我們還在 deps 參數中傳遞了 count 狀態,表示只有當 count 發生變化時才執行副作用操作。

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

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

相關文章

互聯網公司,哪個部門才是鄙視鏈最頂端?

文章目錄 每日一句正能量前言財務部法務部公關部銷售部前臺行政IT部創意部后記 每日一句正能量 我們必須在失敗中尋找勝利&#xff0c;在絕望中尋求希望。 前言 在互聯網公司中&#xff0c;不同職位的鄙視鏈是存在的。有些職位享有高尚的地位&#xff0c;而有些則被看作是次要…

python 爬蟲 m3u8 視頻文件 加密解密 整合mp4

文章目錄 一、完整代碼二、視頻分析1. 認識m3u8文件2. 獲取密鑰&#xff0c;構建解密器3. 下載ts文件4. 合并ts文件為mp4 三、總結 一、完整代碼 完整代碼如下&#xff1a; import requests import re import os from tqdm import tqdm from Crypto.Cipher import AES# 創建臨…

Shopify二次開發之五:元字段(Metafields)

目錄 解釋 操作 1、添加Custom data 2、選擇特定類型的數據 3、為Page配置元子段和值 4、模板訪問 解釋 Shopify Metafields 是一種用于存儲和管理自定義數據的功能。它們允許商戶在商城中的產品、訂單、客戶、Page等對象上添加自定義字段&#xff0c;以滿足特定業務需求…

c語言->自定義類型聯合體和枚舉類型

系列文章目錄 文章目錄 前言 ?作者簡介&#xff1a;大家好&#xff0c;我是橘橙黃又青&#xff0c;一個想要與大家共同進步的男人&#x1f609;&#x1f609; &#x1f34e;個人主頁&#xff1a;橘橙黃又青_C語言,函數,指針-CSDN博客 目的&#xff1a;學習聯合體和枚舉類型的…

[cleanrl] ppo_continuous_action源碼解析

1 import庫&#xff08;略&#xff09; import os import random import time from dataclasses import dataclassimport gymnasium as gym import numpy as np import torch import torch.nn as nn import torch.optim as optim import tyro from torch.distributions.normal…

Kubernetes實戰(八)-防止k8s namespace被誤刪除

1 背景 運維新同學在預發環境操作刪除pod的時候&#xff0c;不知道什么原因把kubectl delete pod命令敲成了kubectl delete ns pre把預發環境刪了&#xff0c;幾十個模塊&#xff0c;將近一個小時才恢復。幸虧是測試環境啊&#xff0c;如果是生產可以可以跑路了。 2 解決方案…

jsonpath:使用Python處理JSON數據

使用Python處理JSON數據 25.1 JSON簡介 25.1.1 什么是JSON JSON全稱為JavaScript Object Notation&#xff0c;一般翻譯為JS標記&#xff0c;是一種輕量級的數據交換格式。是基于ECMAScript的一個子集&#xff0c;采用完全獨立于編程語言的文本格式來存儲和表示數據。簡潔和清…

java對二維數組進行排序

一、按行排序&#xff1a; 對二維數組按進行排序&#xff0c;直接調用Arrays.sort就行&#xff1a; private static int [][] sortRows(int[][] arr) {//行排序for (int i 0; i < arr.length; i) {Arrays.sort(arr[i]);}return arr;}二、按列排序&#xff1a; 1.使用比較…

計算機網絡:應用層(一)

我最近開了幾個專欄&#xff0c;誠信互三&#xff01; > |||《算法專欄》&#xff1a;&#xff1a;刷題教程來自網站《代碼隨想錄》。||| > |||《C專欄》&#xff1a;&#xff1a;記錄我學習C的經歷&#xff0c;看完你一定會有收獲。||| > |||《Linux專欄》&#xff1…

鴻蒙開發之狀態管理@Observed和@ObjectLink

一、使用場景 當對象內引用對象&#xff0c;改變內部對象屬性的時候其他狀態管理如State、Provide、Consume等是無法觸發更新的。同樣&#xff0c;在數組內如果有對象&#xff0c;改變對象的屬性也是無法更新的。在這種情況下就可以采用Observed和ObjectLink裝飾器了。 二、使…

C# WPF上位機開發(簡易圖像處理軟件)

【 聲明&#xff1a;版權所有&#xff0c;歡迎轉載&#xff0c;請勿用于商業用途。 聯系信箱&#xff1a;feixiaoxing 163.com】 圖像處理是工業生產重要的環節。不管是定位、測量、檢測還是識別&#xff0c;圖像處理在工業生產中扮演重要的角色。而c#由于自身快速開發的特點&a…

玩轉 Go 語言并發編程:Goroutine 實戰指南

一、goroutine 池 本質上是生產者消費者模型在工作中我們通常會使用可以指定啟動的 goroutine 數量-worker pool 模式&#xff0c;控制 goroutine 的數量&#xff0c;防止 goroutine 泄漏和暴漲一個簡易的 work pool 示例代碼如下&#xff1a; package mainimport ("fmt…

小程序跳轉tabbar,tabbar頁面不刷新

文章地址&#xff1a;12.小程序 之切換到tabBar頁面不刷新問題_360問答 解決辦法備份&#xff1a; wx.switchTab&#xff1a;跳轉到 tabBar 頁面&#xff0c;并關閉其他所有非 tabBar 頁面 wx.reLaunch&#xff1a;關閉所有頁面&#xff0c;打開到應用內的某個頁面。 wx.reLa…

解決微信小程序中 ‘nbsp;‘ 空格不生效的問題

在微信小程序開發中&#xff0c;我們經常會使用 來表示一個空格。這是因為在 HTML 中&#xff0c;空格會被解析為一個普通字符&#xff0c;而不會產生實際的空白間距。而 是一種特殊的字符實體&#xff0c;它被解析為一個不可見的空格&#xff0c;可以在頁面上產生真正的空…

力扣70. 爬樓梯

動態規劃 思路&#xff1a; 使用遞歸比較容易理解&#xff0c; f(n) f(n - 1) f(n - 2)&#xff1b; 到剩余1級臺階有 f(n - 1)&#xff0c;到剩余2級臺階有 f(n-2)&#xff1b;邊界情況是 n 0, f(0) 1n 1, f(1) 1n 2, f(2) 2 遞歸代碼實現&#xff1a; class Soluti…

Axure RP 9 入門教程

1. Axure簡介 Axure 是一個交互式原型設計工具&#xff0c;可以幫助用戶創建復雜的交互式應用程序和網站。Axure 能夠讓用戶快速構建出具有高度可交互性的原型&#xff0c;可以在團隊中進行協作、分享和測試。 使用 Axure 可以設計出各種不同類型的原型&#xff0c;包括網站、移…

系列十五、搭建redis集群

一、概述 上篇文章介紹了redis集群的相關知識&#xff0c;本章實戰演示redis的集群環境的詳細搭建步驟。如果幫助到了你&#xff0c;請點贊 收藏 關注&#xff01;有疑問的話也可以評論區交流。 二、搭建步驟 2.1、預備知識 判斷一個集群中的節點是否可用&#xff0c;是集群…

【SpringBoot篇】詳解基于Redis實現短信登錄的操作

文章目錄 &#x1f970;前言&#x1f6f8;StringRedisTemplate&#x1f339;使用StringRedisTemplate?常用的方法 &#x1f6f8;為什么我們要使用Redis代替Session進行登錄操作&#x1f386;具體使用?編寫攔截器?配置攔截器&#x1f33a;基于Redis實現發送手機驗證碼操作&am…

EarCMS 前臺任意文件上傳漏洞復現

0x01 產品簡介 EarCMS是一個APP內測分發系統的平臺。 0x02 漏洞概述 EarCMS前臺put_upload.php中,存在pw參數硬編碼問題,同時sql語句pdo使用錯誤,沒有有效過濾sql語句,可以控制文件名和后綴,導致可以任意文件上傳。 0x03 復現環境 FOFA:app="EearCMS" 0x0…

Flutter實現自定義二級列表

在Flutter開發中&#xff0c;其實系統已經給我們提供了一個可靠的二級列表展開的API&#xff08;ExpansionPanelList&#xff09;&#xff0c;我們先看系統的二級列表展開效果&#xff0c;一次只能展開一個&#xff0c;用ExpansionPanelList.radio實現 由此可見&#xff0c;已經…