【React】useCallback 使用的說明

文章目錄

    • useCallback的優缺點
      • 優點
      • 缺點
      • JavaScript 的內聯優化
    • 使用場景

用了兩年多的react,今天抽空寫點小內容

useCallback的優缺點

緩存了每次渲染時候 inline callback的實例

優點

關鍵點:利用memoize減少無效的re-render,通常配合shouldComponentUpdate 或者 React.memo 起到減少不必要渲染的目的

  1. 性能優化:useCallback可以幫助避免每次渲染的時候創建新的函數實例。這對于將函數作為props傳遞給子組件的時候特別有用,因為子組件可以使用React.memo 來進行淺比較,從而避免不必要的重新渲染
  2. 依賴性控制: useCallback 接受一個依賴數組作為第二個參數,使得你可以明確指定哪些變量的變化應該導致函數重新創建。這有助于精確控制依賴,避免不必要的重新計算。

缺點

  1. 過度使用可能導致性能問題:useCallback可能會阻止某些優化(如內聯)
  2. 增加復雜性:在簡單組件中,使用useCallback 可能會顯得過于繁瑣,因此優先考慮組件的復雜性和性能需求,權衡是否使用useCallback
  3. 可能引入bug:如果依賴數組設置不當,導致函數被錯誤緩存

JavaScript 的內聯優化

  1. 內聯優化:內聯指的是 將函數調用代碼直接插入到調用處,而不是通過函數調用方式執行,這樣可以減少函數調用的開銷,提高性能。當使用useCallback 包裹一個函數時候,React 可能無法在一些情況進行內聯,因為useCallback返回的是同一個函數實例,而不是新的函數
const memoizedCallback = useCallback(() => {// function body
}, [/* dependencies */]);// 內聯優化可能受到影響
<SomeComponent onClick={memoizedCallback} />
  1. 對象緩存:內聯也與對象的創建和緩存有關。如果一個函數內部創建了對象,并且該函數被useCallback緩存,那么對象可能被緩存在在閉包中,導致無法及時被垃圾回收。這可能會在長時間運行的應用中引起內存泄露問題
const memoizedCallback = useCallback(() => {const obj = { key: 'value' };// 使用 obj
}, [/* dependencies */]);// obj 可能無法及時被垃圾回收

為了確保在不再需要時能夠及時釋放對象并觸發垃圾回收,你可以采取以下步驟:

import { useCallback, useEffect, useRef } from 'react';const MyComponent = () => {const memoizedObject = useRef(null);memoizedObject.current = useCallback(() => {const obj = { key: 'value' };// 使用 objreturn obj;}, [/* dependencies */]);// ...// 如果 memoizedObject 不再被使用,設置為 null 或者清除引用useEffect(() => {return () => {// 清除對 memoizedObject 的引用// 這樣,在組件卸載或 memoizedObject 不再使用時,可以及時觸發垃圾回收memoizedObject.current = null;};}, []);// ...
};

在這個例子中,我們使用 useEffect 來監聽組件的生命周期,并在組件即將卸載時執行清理操作。通過將 memoizedObject.current 設置為 null 或清除引用,我們告訴垃圾回收器這個對象不再被需要。這有助于確保在組件卸載或不再需要時能夠及時釋放對象并觸發垃圾回收。

請注意,這里使用了 memoizedObject.current,因為在 React Hooks 中,我們經常使用 useRef 來保存可變的值,并確保在組件重新渲染時保持其穩定性。如果你使用 useRef 來保存 memoizedObject,你可以在 useEffect 中設置 memoizedObject.current 為 null 或清除引用。

使用場景

  1. 函數被 useEffect 內部所引用了,但為了避免頻繁的useEffect的頻繁調用,可以選擇包一下;
  2. 需要保存一個函數閉包結果,如配合 debounce、throttle使用;
  3. useCallback包裹的函數,但某個依賴項變化時,引用這個函數的所有 useEffect 都得重新執行一下;

最后分享一個外鏈:Day383:說下 React 的 useEffect、useCallback、useMemo

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

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

相關文章

ElasticSearch之cat trained model API

命令樣例如下&#xff1a; curl -X GET "https://localhost:9200/_cat/ml/trained_models?vtrue&pretty" --cacert $ES_HOME/config/certs/http_ca.crt -u "elastic:ohCxPHQBEs5*lo7F9"執行結果輸出如下&#xff1a; id heap_size …

如何在OpenWRT軟路由系統部署uhttpd搭建web服務器實現遠程訪問——“cpolar內網穿透”

文章目錄 前言1. 檢查uhttpd安裝2. 部署web站點3. 安裝cpolar內網穿透4. 配置遠程訪問地址5. 配置固定遠程地址 前言 uhttpd 是 OpenWrt/LuCI 開發者從零開始編寫的 Web 服務器&#xff0c;目的是成為優秀穩定的、適合嵌入式設備的輕量級任務的 HTTP 服務器&#xff0c;并且和…

docker-compose的介紹與使用

一、docker-compose 常用命令和指令 1. 概要 默認的模板文件是 docker-compose.yml&#xff0c;其中定義的每個服務可以通過 image 指令指定鏡像或 build 指令&#xff08;需要 Dockerfile&#xff09;來自動構建。 注意如果使用 build 指令&#xff0c;在 Dockerfile 中設置…

RHEL網絡服務器

目錄 1.時間同步的重要性 2.配置時間服務器 &#xff08;1&#xff09;指定所使用的上層時間服務器。 (2&#xff09;指定允許訪問的客戶端 (3&#xff09;把local stratum 前的注釋符#去掉。 3.配置chrony客戶端 &#xff08;1&#xff09;修改pool那行,指定要從哪臺時間…

Python常見面試知識總結(一):迭代器、拷貝、線程及底層結構

前言&#xff1a; Hello大家好&#xff0c;我是Dream。 今天來總結一下Python和C語言中常見的面試知識&#xff0c;歡迎大家一起前來探討學習~ 【一】Python中迭代器的概念&#xff1f; 可迭代對象是迭代器、生成器和裝飾器的基礎。簡單來說&#xff0c;可以使用for來循環遍歷…

[古劍山2023] pwn

最近這個打stdout的題真多。這個比賽沒打。拿到附件作了一天。 choice 32位&#xff0c;libc-2.23-i386&#xff0c;nbytes初始值為0x14,讀入0x804A04C 0x14字節后會覆蓋到nbytes 1個字節。當再次向v1讀入nbytes字節時會造成溢出。 先寫0x14p8(0xff)覆蓋到nbytes然后溢出寫傳…

初次參加軟考就想報高級,哪個相對容易考?

如果你想第一次參加軟考時就報考高級科目&#xff0c;但是卻不知道該報考高級中的哪個科目好、 ? ?那么今天的這篇文章你一定不要錯過&#xff01;首先&#xff0c;我們一起來了解一下&#xff0c;軟考高級中的5個科目。 ? ?軟考高級科目 ? 信息系統項目管理師 ? …

記錄一次postgresql臨時表丟失問題

項目相關技術棧 springboot hikari連接池pgbouncerpostgresql數據庫 背景 為了優化一個任務執行的速度&#xff0c;我將任務的sql中部分語句抽出生成臨時表&#xff08;create temp table tempqw as xxxxxxxxx&#xff09;&#xff0c;再和其他表關聯&#xff0c;提高查詢速…

三翼鳥2023輝煌收官, 定盤2024高質量棋局

最近在不同平臺上接連看到這樣的熱搜話題&#xff1a;用時間膠囊記錄2023的自己、2023年度問答、2023十大網絡流行語公布… 顯然&#xff0c; 2023年進入最后一個月&#xff0c;時間匆匆&#xff0c;這也意味著又到了總結過去和規劃未來的時候。拿到結果、取得成績當然是對202…

算法通關村第十五關 | 白銀 | 海量數據場景下的熱門算法題

1.從 40 個億中產生一個不存在的整數 可以采用位圖存儲數據&#xff0c;申請一個 bit 類型的數組 bitArr &#xff0c;每個位置只表示 0 或者 1 狀態&#xff0c;可以將占用內存縮小為使用哈希表的 1/32 。 遍歷給定的 40 億個數&#xff0c;遇到數時就將 bitArr 相應位置設置…

短視頻引流獲客系統:引領未來營銷的新潮流

在這個信息爆炸的時代&#xff0c;短視頻已經成為了人們獲取信息的主要渠道之一。而隨著短視頻的火爆&#xff0c;引流獲客系統也逐漸成為了營銷領域的新寵。本文將詳細介紹短視頻引流獲客系統的開發流程以及涉及到的技術&#xff0c;讓我們一起來看看這個引領未來營銷的新潮流…

華清遠見作業第二十四天

使用消息隊列完成兩個進程之間相互通信 代碼 #include<stdio.h> #include<string.h> #include<stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/ipc.h> #include <sys/msg.h> #in…

k8s一鍵部署uniswap

1、拉取uniswap源碼 github地址 2、編寫Dockerfile并打鏡像 # Set the base image FROM node:18.10.0# WORKDIR /usr/src/app/ WORKDIR /home/gateway# Copy files COPY ./ /home/gateway/# Dockerfile author / maintainer LABEL maintainer"Michael Feng <mikehummi…

Java最全面試題專題---2、Java集合容器(2)

Map接口 說一下 HashMap 的實現原理&#xff1f; HashMap概述&#xff1a; HashMap是基于哈希表的Map接口的非同步實現。此實現提供所有可選的映射操作&#xff0c;并允許使用null值和null鍵。此類不保證映射的順序&#xff0c;特別是它不保證該順序恒久不變。 HashMap的數據…

C語言-枚舉

常量符號化 用符號而不是具體的數字來表示程序中的數字 枚舉 用枚舉而不是定義獨立的const int變量 枚舉是一種用戶定義的數據類型&#xff0c;他用關鍵詞enum以如下語法來聲明&#xff1a; enum枚舉類型名字{名字0&#xff0c;…&#xff0c;名字n}&#xff1b; 枚舉類型名…

外包干了3年,技術退步太明顯了。。。。。

先說一下自己的情況&#xff0c;本科生生&#xff0c;18年通過校招進入武漢某軟件公司&#xff0c;干了差不多3年的功能測試&#xff0c;今年國慶&#xff0c;感覺自己不能夠在這樣下去了&#xff0c;長時間呆在一個舒適的環境會讓一個人墮落!而我已經在一個企業干了四年的功能…

6_CSS布局之浮動的應用

day06_CSS布局之浮動的應用 本課目標&#xff08;Objective&#xff09; 理解什么是浮動掌握浮動的三種機制掌握浮動的案例應用 1 CSS 布局的三種機制 CSS 提供了 3 種機制來設置盒子的擺放位置&#xff0c;分別是普通流&#xff08;標準流&#xff09;、浮動和定位。 普通流…

HarmonyOS開發:回調實現網絡的攔截

前言 基于http封裝的一個網絡庫&#xff0c;里面有一個知識點&#xff0c;在初始化的時候&#xff0c;可以設置請求頭攔截和請求錯誤后的信息的攔截&#xff0c;具體案例如下&#xff1a; et.getInstance().init({netErrorInterceptor: new MyNetErrorInterceptor(), //設置全…

web網絡安全

web安全 一&#xff0c;xss 跨站腳本攻擊(全稱Cross Site Scripting,為和CSS&#xff08;層疊樣式表&#xff09;區分&#xff0c;簡稱為XSS)是指惡意攻擊者在Web頁面中插入惡意javascript代碼&#xff08;也可能包含html代碼&#xff09;&#xff0c;當用戶瀏覽網頁之時&…

關于北京醫學sci論文翻譯

在醫學領域&#xff0c;翻譯論文是一項非常重要的工作。醫學論文的翻譯需要準確、專業、嚴謹&#xff0c;同時也需要考慮到醫學領域的特殊性和復雜性。那么&#xff0c;如何翻譯醫學論文呢&#xff1f;北京醫學SCI論文翻譯哪家好呢&#xff1f; 首先&#xff0c;需要具備專業的…