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

解析react?函數(shù)組件輸入卡頓問題?usecallback?react.memo

 更新時(shí)間:2022年07月15日 09:40:20   作者:用戶4238953559166  
useMemo是一個(gè)react hook,我們可以使用它在組件中包裝函數(shù)??梢允褂盟鼇泶_保該函數(shù)中的值僅在依賴項(xiàng)之一發(fā)生變化時(shí)才重新計(jì)算,這篇文章主要介紹了react?函數(shù)組件輸入卡頓問題?usecallback?react.memo,需要的朋友可以參考下

現(xiàn)象

在輸入問題時(shí),輸入框響應(yīng)巨慢。

效果圖

分析

右側(cè)控制臺(tái)顯示,子組件不停在mount unmount,子組件中使用了CKEditor組件,每次mount開支較大,導(dǎo)致輸入卡頓

代碼如下:

 const qdata = (q.qdata || [
    { id: getQuestionId('OPTION') },
    { id: getQuestionId('OPTION') },
  ]) as SelectOption[];
const renderEdit = () => {
  console.log('hh');
  return (
    <div
      className={classnames(
        styles.question_content_radio,
        styles.question_content_radio_edit,
      )}
      >
      {qdata.map((i, index) => (
        <DNDCard key={i.id} id={i.id} index={index} moveCard={() => {}}>
          <div className={styles.radio_item}>
            <CKInlineEditor
              config={{ placeholder: '選項(xiàng)' + (index + 1) }}
              data={i.title}
              onChange={(data) => {
              }}
              ></CKInlineEditor>
          </div>
        </DNDCard>
      ))}
    </div>
  );
  };

qdata每次都會(huì)重新生成新的隨機(jī)id,導(dǎo)致組件不停卸載,掛載

  const qdata = (q.qdata || [
    { id: getQuestionId('OPTION') },
    { id: getQuestionId('OPTION') },
  ]) as SelectOption[];
{qdata.map((i, index) => (
        <DNDCard key={i.id} id={i.id} index={index} moveCard={() => {}}>
          <div className={styles.radio_item}>
            <CKInlineEditor
              config={{ placeholder: '選項(xiàng)' + (index + 1) }}
              data={i.title}
              onChange={(data) => {
              }}
              ></CKInlineEditor>
          </div>
        </DNDCard>
      ))}

解決

方案一:

使用React.memo 包裹子組件,使其在只有關(guān)心的屬性更新時(shí)再重新渲染,類似pure component.

Recat.memo 的函數(shù)簽名

  function memo<P extends object>(
        Component: FunctionComponent<P>,
        propsAreEqual?: (prevProps: Readonly<P>, nextProps: Readonly<P>) => boolean
    ): NamedExoticComponent<P>;
export default memo(QuestionRadio, (prevprops, nextprops) => {
  return prevprops.q.qdata === nextprops.q.qdata && prevprops.isEdit === nextprops.isEdit;
});

效果圖, 子組件沒有隨之渲染

方案二:

使用useCallback包裹 指定render函數(shù),避免其在每次渲染時(shí)重復(fù)創(chuàng)建函數(shù),保存函數(shù)引用。

useCallback中引用的值是第一次創(chuàng)建時(shí)的值,采用閉包保存下來,因此后面渲染用到的qdata屬性都是不變的,這樣該段代碼<DNDCard key={i.id} id={i.id} index={index} moveCard={() => {}}>中的key值就不會(huì)因?yàn)殡S意變動(dòng)而導(dǎo)致組件不停卸載,掛載。

這樣就避免了

ckeditor組件被重復(fù)卸載重新掛載。

代碼如下

  const renderEdit = useCallback(() => {
    console.log('hh');
    return (
      <div
        className={classnames(
          styles.question_content_radio,
          styles.question_content_radio_edit,
        )}
      >
        {qdata.map((i, index) => (
          <DNDCard key={i.id} id={i.id} index={index} moveCard={() => {}}>
            <div className={styles.radio_item}>
              <CKInlineEditor
                config={{ placeholder: '選項(xiàng)' + (index + 1) }}
                data={i.title}
                onChange={(data) => {
                }}
              ></CKInlineEditor>
            </div>
          </DNDCard>
        ))}
      </div>
    );
  }, []);

效果圖,子組件還是渲染了,但是避免了 CKInlineEditor的開支

弊端

使用usecallback包裹renderEdit后,該函數(shù)中的所有變量都會(huì)采用第一次創(chuàng)建該函數(shù)時(shí)的值,不會(huì)隨之更新。導(dǎo)致界面無法正確顯示數(shù)據(jù)。

此處功能正常是因?yàn)?code>qdata是一個(gè)對象數(shù)組,引用地址沒變,但其值發(fā)生了變化,所以界面顯示正常。

如果是值類型,就有問題了

我們不能依賴該性質(zhì)來投機(jī)取巧,而應(yīng)該明確的指定useCallback的依賴項(xiàng)

最終的辦法是將生成隨機(jī)ID的代碼提出到組件外,分析了半天,發(fā)現(xiàn)是自己的代碼有問題??

如下:

const defaultOptions = [
  { id: getQuestionId('OPTION') },
  { id: getQuestionId('OPTION') },
];
const QuestionRadio: React.FC<{
  q: SurveyQuestion;
  isEdit: boolean;
  index: number;
}> = ({ q, isEdit, index }) => {
  const { loading, run, error } = useEditQuestionTitle();
  const qdata = (q.qdata || defaultOptions) as SelectOption[];
  ....
  ...
}

到此這篇關(guān)于react 函數(shù)組件輸入卡頓問題 usecallback react.memo的文章就介紹到這了,更多相關(guān)react 函數(shù)組件輸入卡頓內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • React項(xiàng)目中hook實(shí)現(xiàn)展示對話框功能

    React項(xiàng)目中hook實(shí)現(xiàn)展示對話框功能

    Modal(模態(tài)框)是 web 開發(fā)中十分常見的組件,即從頁面中彈出的對話框,下面這篇文章主要給大家介紹了關(guān)于React項(xiàng)目中hook實(shí)現(xiàn)展示對話框功能的相關(guān)資料,需要的朋友可以參考下
    2022-05-05
  • react native與webview通信的示例代碼

    react native與webview通信的示例代碼

    本篇文章主要介紹了react native與webview通信的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-09-09
  • React組件中使用JSON數(shù)據(jù)文件的方法詳解

    React組件中使用JSON數(shù)據(jù)文件的方法詳解

    要在 React 組件中使用 JSON 數(shù)據(jù),有多種方法,這篇文章主要為大家詳細(xì)介紹了五個(gè)常見的方法,文中的示例代碼講解詳細(xì),有需要的小伙伴可以了解下
    2024-01-01
  • react-redux及redux狀態(tài)管理工具使用詳解

    react-redux及redux狀態(tài)管理工具使用詳解

    Redux是為javascript應(yīng)用程序提供一個(gè)狀態(tài)管理工具集中的管理react中多個(gè)組件的狀態(tài)redux是專門作狀態(tài)管理的js庫(不是react插件庫可以用在其他js框架中例如vue,但是基本用在react中),這篇文章主要介紹了react-redux及redux狀態(tài)管理工具使用詳解,需要的朋友可以參考下
    2023-01-01
  • 解決React報(bào)錯(cuò)Property 'X' does not exist on type 'HTMLElement'

    解決React報(bào)錯(cuò)Property 'X' does not 

    這篇文章主要為大家介紹了解決React報(bào)錯(cuò)Property 'X' does not exist on type 'HTMLElement',有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • React路由攔截模式及withRouter示例詳解

    React路由攔截模式及withRouter示例詳解

    這篇文章主要為大家介紹了React路由攔截模式及withRouter示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • 淺談React Router關(guān)于history的那些事

    淺談React Router關(guān)于history的那些事

    這篇文章主要介紹了淺談React Router關(guān)于history的那些事,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • React+Node實(shí)現(xiàn)大文件分片上傳、斷點(diǎn)續(xù)傳秒傳思路

    React+Node實(shí)現(xiàn)大文件分片上傳、斷點(diǎn)續(xù)傳秒傳思路

    本文主要介紹了React+Node實(shí)現(xiàn)大文件分片上傳、斷點(diǎn)續(xù)傳秒傳思路,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • react 父組件與子組件之間的值傳遞的方法

    react 父組件與子組件之間的值傳遞的方法

    本篇文章主要介紹了react 父組件與子組件之間的值傳遞的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-09-09
  • react 通過后端接口實(shí)現(xiàn)路由授權(quán)的示例代碼

    react 通過后端接口實(shí)現(xiàn)路由授權(quán)的示例代碼

    本文主要介紹了React應(yīng)用中通過后端接口獲取路由授權(quán),實(shí)現(xiàn)動(dòng)態(tài)和靈活的權(quán)限管理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-11-11

最新評論

青神县| 新巴尔虎右旗| 霍州市| 五家渠市| 龙游县| 宾阳县| 民和| 建瓯市| 宁明县| 石嘴山市| 开化县| 阳高县| 巴林左旗| 新郑市| 灵川县| 太和县| 离岛区| 宜宾县| 喀喇沁旗| 祁连县| 琼海市| 大名县| 乌鲁木齐县| 西和县| 马尔康县| 济源市| 大名县| 沾化县| 建平县| 凤冈县| 太和县| 阳东县| 洞头县| 千阳县| 进贤县| 涿州市| 兴和县| 高州市| 双江| 宣城市| 独山县|