最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

React中useCallback useMemo使用方法快速精通

 更新時(shí)間:2023年02月14日 16:53:31   作者:星海拾遺  
在React函數(shù)組件中,當(dāng)組件中的props發(fā)生變化時(shí),默認(rèn)情況下整個(gè)組件都會(huì)重新渲染。換句話說,如果組件中的任何值更新,整個(gè)組件將重新渲染,包括沒有更改values/props的函數(shù)/組件。在react中,我們可以通過memo,useMemo以及useCallback來防止子組件的rerender

首先從簡(jiǎn)單的講一下兩者的區(qū)別

useCallback和useMemo的區(qū)別

基本使用

	// 貼上代碼片利于復(fù)制
	import { React, useState, useMemo, useCallback } from "react";
	export default function TestPage() {
	  const callBack = useCallback(() => {
	    console.log(1);
	  }, []);
	  const memo = useMemo(() => 123, []);
	  console.log("callback", callBack);
	  console.log("memo是", memo);
	  return (
	    <div>
	      <div>一個(gè)專門用于vue測(cè)試的頁(yè)面</div>
	    </div>
	  );
}

控制臺(tái)輸出如下

可以直觀的看到,useCallBack返回的是一個(gè)函數(shù),useMemo返回的是一個(gè)變量。

接下來我們來剖析這兩個(gè)東西的用法

useMemo

首先從簡(jiǎn)單的講起,如果你學(xué)過Vue的話,完全可以把它當(dāng)成Computed來理解。在這里舉一個(gè)很好理解的

	import { React, useState, useMemo, useCallback } from "react";
	export default function TestPage() {
	  const [data, updateData] = useState(1);
	  const getComplicatedValue = () => {
	    console.log("開始計(jì)算一個(gè)復(fù)雜的value值啦!");
	    let total = 0;
	    for (let i = 0; i < 100; i++) {
	      total += i;
	    }
	    return total;
	  };
	  const changeData = () => {
	    updateData((oldValue) => oldValue + 1);
	  };
	  return (
	    <div>
	      <div>一個(gè)專門用于vue測(cè)試的頁(yè)面</div>
	      <div>這是一個(gè)復(fù)雜函數(shù)計(jì)算出來的值{getComplicatedValue()}</div>
	      <div>這是一個(gè)簡(jiǎn)簡(jiǎn)單單的data值{data}</div>
	      <button onClick={changeData}>點(diǎn)擊我改變data值</button>
	    </div>
	  );
	}

大意就是,頁(yè)面上有一個(gè)很簡(jiǎn)單的值data,還有一個(gè)很復(fù)雜的經(jīng)過函數(shù)計(jì)算出來的值getComplicatedValue,這里我用從1加到100來模擬了一個(gè)很復(fù)雜的計(jì)算過程(實(shí)際項(xiàng)目會(huì)更復(fù)雜)。

頁(yè)面顯示如下

顯示正常,根據(jù)控制臺(tái)顯示也可以看到getComplicatedValue函數(shù)也被正常調(diào)用了。接下來我們點(diǎn)擊按鈕改變data的值。

可以看到頁(yè)面是正常更新了的,但是性能問題出現(xiàn)了,我改變了data的值,導(dǎo)致render函數(shù)重新執(zhí)行,然后getComplicatedValue又被執(zhí)行了一遍!也就是計(jì)算機(jī)重新計(jì)算了1加到100。那么問題出現(xiàn)了,如果我是1加到100000呢?很顯然,在我們更新data值的時(shí)候,并不需要getComplicatedValue再次執(zhí)行,而是希望它的計(jì)算值被緩存起來。useMemo閃亮登場(chǎng)!!!當(dāng)當(dāng)當(dāng)當(dāng)。

改寫如下,改寫只需要改動(dòng)兩行

	import { React, useState, useMemo, useCallback } from "react";
	export default function TestPage() {
	  const [data, updateData] = useState(1);
	  const getComplicatedValue = useMemo(() => {
	    console.log("開始計(jì)算一個(gè)復(fù)雜的value值啦!");
	    let total = 0;
	    for (let i = 0; i < 100; i++) {
	      total += i;
	    }
	    return total;
	  },[]);
	  const changeData = () => {
	    updateData((oldValue) => oldValue + 1);
	  };
	  return (
	    <div>
	      <div>一個(gè)專門用于vue測(cè)試的頁(yè)面</div>
	      <div>這是一個(gè)復(fù)雜函數(shù)計(jì)算出來的值{getComplicatedValue}</div>
	      <div>這是一個(gè)簡(jiǎn)簡(jiǎn)單單的data值{data}</div>
	      <button onClick={changeData}>點(diǎn)擊我改變data值</button>
	    </div>
	  );
	}

第四行把getComplicatedValue函數(shù)用useMemo包裹起來。第18行刪除(),因?yàn)閯倓傄呀?jīng)說過,useMemo返回的是一個(gè)值而不是函數(shù)。

接下來再看看頁(yè)面效果

這次可以看到,無論data值更新多少次,getComplicatedValue永遠(yuǎn)只執(zhí)行了初始化的那一次。

來個(gè)首尾呼應(yīng)

基本使用

const memo = useMemo(() => {<!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E-->},[依賴項(xiàng)數(shù)組])

如果依賴項(xiàng)數(shù)組里面的數(shù)據(jù)沒有變化,那么memo值永遠(yuǎn)使用緩存,而不會(huì)重新計(jì)算

useCallback

useCallback比起useMemo就難上了一丟丟,因?yàn)樯婕暗搅俗咏M件。當(dāng)然也是灰常簡(jiǎn)單。

首先來看一個(gè)簡(jiǎn)單

父組件

	import { React, useState, useMemo, useCallback } from "react";
	import TestSonComp from "./testSonComp";
	export default function TestPage() {
	  const [data, updateData] = useState(1);
	  const getValue = () => {
	    console.log("我是父組件的一個(gè)函數(shù)");
	  };
	  const changeData = () => {
	    updateData((oldValue) => oldValue + 1);
	  };
	  return (
	    <div>
	      <div>一個(gè)專門用于vue測(cè)試的頁(yè)面</div>
	      <div>這是一個(gè)簡(jiǎn)簡(jiǎn)單單的data值{data}</div>
	      <button onClick={changeData}>點(diǎn)擊我改變data值</button>
	      <TestSonComp getValue={getValue} />
	    </div>
	  );
}

子組件

	import { React, memo } from "react";
	const TestSonComp = (props) => {
	  console.log("子組件render函數(shù)執(zhí)行了");
	  return <div>一個(gè)子組件</div>;
	};
	export default TestSonComp;

頁(yè)面顯示正常,然后點(diǎn)擊按鈕更新數(shù)據(jù)

那么此時(shí)問題又出現(xiàn)了,我就是在父組件中改了一下data值,data值導(dǎo)致父組件render重新執(zhí)行,render生成了一個(gè)新的getValue函數(shù),然后子組件props更新,導(dǎo)致子組件更新。那么有沒有一個(gè)方法可以把函數(shù)緩存起來呢?

useCallback閃亮登場(chǎng)。

直接改寫父組件定義函數(shù)的一行

	  const getValue = useCallback(() => {
	    console.log("我是父組件的一個(gè)函數(shù)");
	  }, []);

改完之后看頁(yè)面效果你依然會(huì)發(fā)現(xiàn)和上圖一樣,子組件依然會(huì)更新!

問題出在這

useCallback必須配合React.memo來使用

react的Hooks組件對(duì)props的淺比較是在memo里面比較的(類組件是在shouldComponentUpdate里面),如果沒有memo,那么你使用useCallback就沒有意義

怎么使用?

子組件直接改寫最后一行

export default memo(TestSonComp);

二話不說看效果

改寫成功

再來個(gè)溫故知新

基本使用

const callback = useCallback(() => {<!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E-->},[依賴項(xiàng)數(shù)組])

如果依賴項(xiàng)數(shù)組里面的數(shù)據(jù)沒有變化,那么函數(shù)值也永遠(yuǎn)使用緩存。

到此這篇關(guān)于React中useCallback useMemo使用方法快速精通的文章就介紹到這了,更多相關(guān)React useCallback useMemo內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • React合成事件原理解析

    React合成事件原理解析

    事件是在編程時(shí)系統(tǒng)內(nèi)發(fā)生的動(dòng)作或者發(fā)生的事情,而開發(fā)者可以某種方式對(duì)事件做出回應(yīng),而這里有幾個(gè)先決條件,這篇文章主要介紹了React合成事件原理解析,需要的朋友可以參考下
    2022-07-07
  • react配置antd按需加載的使用

    react配置antd按需加載的使用

    這篇文章主要介紹了react配置antd按需加載的使用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-02-02
  • react-pdf實(shí)現(xiàn)將pdf文件轉(zhuǎn)為圖片,用于頁(yè)面展示

    react-pdf實(shí)現(xiàn)將pdf文件轉(zhuǎn)為圖片,用于頁(yè)面展示

    這篇文章主要介紹了react-pdf實(shí)現(xiàn)將pdf文件轉(zhuǎn)為圖片,用于頁(yè)面展示問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • react-router-dom?v6?使用詳細(xì)示例

    react-router-dom?v6?使用詳細(xì)示例

    這篇文章主要介紹了react-router-dom?v6使用詳細(xì)示例,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下,希望對(duì)你的學(xué)習(xí)有所幫助
    2022-09-09
  • 詳解react native頁(yè)面間傳遞數(shù)據(jù)的幾種方式

    詳解react native頁(yè)面間傳遞數(shù)據(jù)的幾種方式

    這篇文章主要介紹了詳解react native頁(yè)面間傳遞數(shù)據(jù)的幾種方式,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-11-11
  • react dva實(shí)現(xiàn)的代碼

    react dva實(shí)現(xiàn)的代碼

    dva是一個(gè)基于redux和redux-saga的數(shù)據(jù)流方案,然后為了簡(jiǎn)化開發(fā)體驗(yàn),dva額外內(nèi)置了react-router,fetch,可以激烈為一個(gè)輕量級(jí)的應(yīng)用框架,這篇文章主要介紹了react dva實(shí)現(xiàn),需要的朋友可以參考下
    2021-11-11
  • 深入理解React調(diào)度(Scheduler)原理

    深入理解React調(diào)度(Scheduler)原理

    本文主要介紹了深入理解React調(diào)度(Scheduler)原理,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • React?Native熱重載時(shí)遇到的問題及解決過程

    React?Native熱重載時(shí)遇到的問題及解決過程

    熱重載失效常見于文件類型不支持、配置錯(cuò)誤、代碼語法問題及狀態(tài)/樣式?jīng)_突,解決方法包括啟用調(diào)試菜單、清除緩存、手動(dòng)重啟,優(yōu)化項(xiàng)目體積,升級(jí)React?Native版本,或改用FastRefresh提升兼容性與效率
    2025-09-09
  • 基于React-Dropzone開發(fā)上傳組件功能(實(shí)例演示)

    基于React-Dropzone開發(fā)上傳組件功能(實(shí)例演示)

    這篇文章主要介紹了基于React-Dropzone開發(fā)上傳組件,主要講述的是在React-Flask框架上開發(fā)上傳組件的技巧,需要的朋友可以參考下
    2021-08-08
  • React?中如何將CSS?visibility?屬性設(shè)置為?hidden

    React?中如何將CSS?visibility?屬性設(shè)置為?hidden

    這篇文章主要介紹了React中如何將CSS?visibility屬性設(shè)置為?hidden,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-05-05

最新評(píng)論

神池县| 庐江县| 玉林市| 修水县| 安阳县| 桐乡市| 黄大仙区| 通山县| 景宁| 水富县| 陇南市| 玉林市| 武清区| 正安县| 鹿泉市| 麻江县| 吉安市| 义乌市| 宝兴县| 科技| 包头市| 崇阳县| 宁强县| 土默特左旗| 兴安县| 芦山县| 江门市| 柘荣县| 金山区| 民乐县| 文安县| 盐山县| 洛隆县| 石狮市| 逊克县| 辽宁省| 常州市| 古浪县| 和林格尔县| 毕节市| 鄂州市|