欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

React性能debug場(chǎng)景解決記錄

 更新時(shí)間:2023年05月25日 08:31:43   作者:Grewer  
這篇文章主要為大家介紹了React性能debug場(chǎng)景解決記錄,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

前言

之前開發(fā)重構(gòu)項(xiàng)目的時(shí)候,遇到了一些問(wèn)題, 如 hooks 的性能問(wèn)題和 quill 的重載問(wèn)題。本文就是記錄這些問(wèn)題的解決過(guò)程。

場(chǎng)景

在基于富文本的輸入場(chǎng)景中,我們發(fā)現(xiàn)在輸入回車后會(huì)出現(xiàn)明顯的卡頓現(xiàn)象。為了更好地展示此類場(chǎng)景,這里使用了一個(gè)簡(jiǎn)單的例子展示。

function App() {
    const [value, setValue] = useState('');
    // mock 調(diào)用多次 hooks
    const hook1 = useHooks();
    //...
    const hook20 = useHooks();
    const modules = useMemo(() => ({
        toolbar: {
            container: '#toolbar',
            handlers: {
            },
        },
    }), []);
    return (<div className={'container'}>
        <CustomToolbar/>
        <ReactQuill ref={editorRef} theme="snow" value={value} modules={modules} onChange={setValue}/>
        <form className="todo-list">
            {/* ... */}
        </form>
    </div>)
}

這是頁(yè)面的主要結(jié)構(gòu), 內(nèi)容分別是一堆 hooks + quill + 其他操作(這里用一個(gè) TODO list 來(lái)替代)

性能監(jiān)控

既然是卡頓,那當(dāng)然屬于性能方面的問(wèn)題 ,這里就輪到 Chrome 的性能監(jiān)控出場(chǎng)了: 重復(fù)步驟, 最后縮短監(jiān)控范圍, 點(diǎn)擊卡頓的任務(wù)

再來(lái)看下調(diào)用樹:

很明顯, 光看這里很難發(fā)現(xiàn)是頁(yè)面那個(gè)地方的問(wèn)題, 都是 react 的源碼執(zhí)行函數(shù)

最關(guān)鍵的點(diǎn)在于自上而下那一欄:

從這里, 我們很明顯的就能看到是這個(gè) hooks - useI18n 影響到了

因?yàn)檫@是一個(gè)多語(yǔ)言 hooks, 所以它的引用范圍特別廣

因?yàn)椴环奖阃嘎对创a, 大概的邏輯是這樣的:

const useHooks = () => {
  const {lang, handle:langHandle} = useContext(myContext);
  const handle = (number) => {
    langHandle();
  }
  return {
    value: lang,
    setValue: handle
  }
}

解決方案

這里我嘗試加上 react 的性能優(yōu)化 useMemo:

const useHooks = () => {
  const {lang, handle:langHandle} = useContext(myContext);
  const handle = (number) => {
    langHandle();
  }
  return useMemo(() => ({
    value: lang,
    setValue: handle
  }), [lang, handle])
}

再通使用 Chrome 的性能監(jiān)控, 發(fā)現(xiàn)問(wèn)題已經(jīng)緩解

由此可得出結(jié)論, 在多場(chǎng)景使用的 hooks 中, 可通過(guò)在返回值中加上 useMemo 來(lái)提高性能

當(dāng)然, 除了 hooks 的優(yōu)化, 阻止其他組件的重渲染, 也可以緩解一定的渲染性能問(wèn)題

這里又回到了我們老生常談的 react 性能優(yōu)化那一套, 就不贅述了

quill.js 的重渲染

在 function 組件中添加 quill.js 富文本的時(shí)候, 會(huì)經(jīng)常出現(xiàn)重復(fù)渲染導(dǎo)致編輯器加載出現(xiàn)問(wèn)題的場(chǎng)景, 報(bào)錯(cuò)如圖:

一般來(lái)說(shuō)都是因?yàn)?nbsp;quill 的 modules 對(duì)象指向改變了, 這一點(diǎn)在 hooks 組件中會(huì)經(jīng)常遇到:

function App(){
  const modules = {
    toolbar: {
      container: '#toolbar',
      handlers: {
        handleClick
      },
    },
  }
  return (
    <ReactQuill ref={editorRef} theme="snow" value={value} modules={modules} onChange={setValue}/>
  )
}

如上述的代碼, 由于 react 的機(jī)制問(wèn)題, 在每次 render 時(shí), 都會(huì)觸發(fā) reRender, 重新聲明一個(gè) modules, 造成 react-quill 中的傳值問(wèn)題

常見的解決方案就是萬(wàn)能的 useRef 了:

function App(){
  const modulesRef = useRef({
    toolbar: {
      container: '#toolbar',
      handlers: {
        handleClick
      },
    },
  })
  return (
    <ReactQuill ref={editorRef} theme="snow" value={value} modules={modulesRef.current} onChange={setValue}/>
  )
}

在 react 的 hooks 中, useRef 反而是一個(gè)比較 OOP 的函數(shù), 因?yàn)樵O(shè)置之后, 不管 render 幾次, 他的對(duì)象引用都不會(huì)變化;

就像是 class 中構(gòu)造函數(shù)里設(shè)置了 this.query = {}, 在 render 過(guò)程中 query 值引用都是不變的

由此, 很多自定義 hooks, 都用上了他

比如最常見的 useUpdateEffect:

const createUpdateEffect = (hook) => (effect, deps) => {
    const isMounted = useRef(false);
    // for react-refresh
    hook(() => {
      return () => {
        isMounted.current = false;
      };
    }, []);
    hook(() => {
      if (!isMounted.current) {
        isMounted.current = true;
      } else {
        return effect();
      }
    }, deps);
  };
useUpdateEffect = createUpdateEffect(useEffect)

代碼來(lái)源于 ahooks, 使用 ref 的值來(lái)標(biāo)記一個(gè)私有化值

原理都是很簡(jiǎn)單的,但是在開發(fā)中想要得心應(yīng)手,還需要更多的練習(xí)。

總結(jié)

使用 hooks 進(jìn)行組件開發(fā)時(shí),頻繁更新會(huì)影響性能。

通過(guò)優(yōu)化代碼避免無(wú)用渲染,提高組件性能。

在使用 quill 編輯器時(shí),重載頁(yè)面或組件會(huì)導(dǎo)致編輯內(nèi)容丟失。

通過(guò) useRef 的使用可以保證對(duì)象指向從而解決該問(wèn)題,保證編輯器穩(wěn)定可靠。

在開發(fā)中遇到問(wèn)題是常見的,需要及時(shí)記錄和解決,提高開發(fā)效率和質(zhì)量。

以上就是React性能debug場(chǎng)景解決記錄的詳細(xì)內(nèi)容,更多關(guān)于React性能debug的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • react-native?父函數(shù)組件調(diào)用類子組件的方法(實(shí)例詳解)

    react-native?父函數(shù)組件調(diào)用類子組件的方法(實(shí)例詳解)

    這篇文章主要介紹了react-native?父函數(shù)組件調(diào)用類子組件的方法,通過(guò)詳細(xì)步驟介紹了React 函數(shù)式組件之父組件調(diào)用子組件的方法,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09
  • 一文帶你搞懂React中的useReducer

    一文帶你搞懂React中的useReducer

    useReducer 是除useState之外另一個(gè)與狀態(tài)管理相關(guān)的 hook,這篇文章主要為大家介紹了useReducer應(yīng)用的相關(guān)知識(shí),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-06-06
  • 圖文示例講解useState與useReducer性能區(qū)別

    圖文示例講解useState與useReducer性能區(qū)別

    這篇文章主要為大家介紹了useState與useReducer性能區(qū)別圖文示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • React Native中ScrollView組件輪播圖與ListView渲染列表組件用法實(shí)例分析

    React Native中ScrollView組件輪播圖與ListView渲染列表組件用法實(shí)例分析

    這篇文章主要介紹了React Native中ScrollView組件輪播圖與ListView渲染列表組件用法,結(jié)合實(shí)例形式詳細(xì)分析了ScrollView組件輪播圖與ListView渲染列表組件具體功能、使用方法與操作注意事項(xiàng),需要的朋友可以參考下
    2020-01-01
  • React中井字棋游戲的實(shí)現(xiàn)示例

    React中井字棋游戲的實(shí)現(xiàn)示例

    本文主要介紹了React中井字棋游戲的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • React父組件數(shù)據(jù)實(shí)時(shí)更新了,子組件沒(méi)有更新的問(wèn)題

    React父組件數(shù)據(jù)實(shí)時(shí)更新了,子組件沒(méi)有更新的問(wèn)題

    這篇文章主要介紹了React父組件數(shù)據(jù)實(shí)時(shí)更新了,子組件沒(méi)有更新的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • React使用useImperativeHandle自定義暴露給父組件的示例詳解

    React使用useImperativeHandle自定義暴露給父組件的示例詳解

    useImperativeHandle?是?React?提供的一個(gè)自定義?Hook,用于在函數(shù)組件中顯式地暴露給父組件特定實(shí)例的方法,本文將介紹?useImperativeHandle的基本用法、常見應(yīng)用場(chǎng)景,需要的可以參考下
    2024-03-03
  • react解析html字符串方法實(shí)現(xiàn)

    react解析html字符串方法實(shí)現(xiàn)

    在使用reactjs庫(kù)的時(shí)候,會(huì)遇到將一段html的字符串,然后要將它插入頁(yè)面中以html的形式展現(xiàn),本文主要介紹了react解析html字符串方法實(shí)現(xiàn),感興趣的可以了解一下
    2023-12-12
  • react?Scheduler?實(shí)現(xiàn)示例教程

    react?Scheduler?實(shí)現(xiàn)示例教程

    這篇文章主要為大家介紹了react?Scheduler?實(shí)現(xiàn)示例教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • React源碼state計(jì)算流程和優(yōu)先級(jí)實(shí)例解析

    React源碼state計(jì)算流程和優(yōu)先級(jí)實(shí)例解析

    這篇文章主要為大家介紹了React源碼state計(jì)算流程和優(yōu)先級(jí)實(shí)例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11

最新評(píng)論