成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Ahooks源碼分析之usePersistFn

開發 前端
官方給的demo中更新textRef寫在了useEffect中,為什么usePersistFn不這樣實現?

usePersistFn

usePersistFn可以持久化function,保證函數地址永遠不會變化。

import { useRef } from 'react';

export type noop = (...args: any[]) => any;

function usePersistFn<T extends noop>(fn: T) {
const fnRef = useRef<T>(fn);
// 每次渲染fn的最新值都會記錄在fnRef中
fnRef.current = fn;

const persistFn = useRef<T>();
// 初次渲染時給persistFn賦值,此后persistFn不會更新
if (!persistFn.current) {
persistFn.current = function (...args) {
return fnRef.current!.apply(this, args);
} as T;
}

// 返回persistFn,感嘆號表示返回值類型非null或undefined,因為初次渲染時persistFn就被賦值為了函數
return persistFn.current!;
}

export default usePersistFn;

為什么要用usePersistFn?

在React官方文檔中提到

在某些場景中,你可能會需要用 useCallback 記住一個回調,但由于內部函數必須經常重新創建,記憶效果不是很好,導致子組件重復 render。對于超級復雜的子組件,重新渲染會對性能造成影響。通過 usePersistFn,可以保證函數地址永遠不會變化。

官方給出的demo如下

function Form() {
const [text, updateText] = useState('');
const textRef = useRef();

useEffect(() => {
textRef.current = text; // 把它寫入 ref
});

const handleSubmit = useCallback(() => {
const currentText = textRef.current; // 從 ref 讀取它
alert(currentText);
}, [textRef]); // 不要像 [text] 那樣重新創建 handleSubmit

return (
<>
<input value={text} onChange={e => updateText(e.target.value)} />
<ExpensiveTree onSubmit={handleSubmit} />
</>
);
}
復制代碼

ExpensiveTree是一個復雜的子組件,其接受一個props handleSubmit函數。如果使用useCallback,由于handleSubmit函數內部使用了text變量,便要寫為如下形式:

const handleSubmit = useCallback(() => {
alert(text);
}, [text]);
復制代碼

只要text發生變化,useCallback接收的內部函數便要重新創建,導致handleSubmit函數的引用地址發生變化。進而引起子組件ExpensiveTree的重渲染,對性能產生影響。

usePersistFn的目標便是持久化接收的函數,且調用時內部函數引用的變量(上例為text)能獲取到實時的值(useCallback的依賴傳空數組也能實現持久化函數,但無法獲取實時的值)

官方給的demo中更新textRef寫在了useEffect中,為什么usePersistFn不這樣實現?

如果在子組件的useEffect回調函數中調用usePersistFn就會出現問題。因為渲染時會先執行子組件的useEffect,后執行父組件自定義hooks的useEffect。

文章出自:??前端餐廳ReTech??,如有轉載本文請聯系前端餐廳ReTech今日頭條號。

github:??https://github.com/zuopf769??

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2022-08-16 21:01:56

runAsyncreload數據

2022-06-06 08:02:21

ahooks架構hooks

2011-05-26 10:05:48

MongoDB

2012-09-20 10:07:29

Nginx源碼分析Web服務器

2021-03-23 09:17:58

SpringMVCHttpServletJavaEE

2021-07-06 09:29:38

Cobar源碼AST

2024-06-13 07:55:19

2011-05-26 16:18:51

Mongodb

2022-07-01 07:31:18

AhooksDOM場景

2020-07-28 08:54:39

內核通信Netlink

2012-09-06 10:07:26

jQuery

2021-09-05 07:35:58

lifecycleAndroid組件原理

2009-07-08 13:22:30

JDK源碼分析Set

2022-01-06 07:06:52

KubernetesResourceAPI

2022-08-27 08:02:09

SQL函數語法

2022-05-30 07:36:54

vmstoragevmselect

2017-01-12 14:52:03

JVMFinalRefere源碼

2023-03-17 07:53:20

K8sAPIServerKubernetes

2019-09-09 06:30:06

Springboot程序員開發

2017-02-27 11:48:58

JVM源碼分析Java
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人二区三区 | 蜜桃视频在线观看免费视频网站www | 亚洲成人动漫在线观看 | 欧美成人一级 | 伊人色综合久久久天天蜜桃 | 亚洲狠狠 | 中文字幕在线欧美 | 国产午夜精品福利 | 91av导航 | 欧美狠狠操| 精品国产一区二区三区性色av | 91中文在线观看 | 精品一区二区在线视频 | 欧美成人精品激情在线观看 | 久久日韩粉嫩一区二区三区 | 欧美综合国产精品久久丁香 | 特黄特黄a级毛片免费专区 av网站免费在线观看 | 亭亭五月激情 | 亚洲精品久久久久久国产精华液 | 欧美日韩亚洲系列 | 成人伊人 | 国产精品毛片一区二区在线看 | 99re在线视频 | av资源中文在线天堂 | 久久精品亚洲精品国产欧美 | h片在线观看网站 | 99久久久久久99国产精品免 | 国产成人综合av | 亚洲精品久久久一区二区三区 | 日韩a视频| 精品日韩在线 | 国产高清视频在线播放 | 日韩精品免费视频 | 综合网伊人 | 成人精品一区二区 | 最新中文字幕第一页视频 | 久久久欧洲 | 欧美国产激情 | 日韩欧美国产一区二区三区 | 亚洲视频一区 | 国产91在线 | 亚洲 |