国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

React--》React組件變化每次都會導(dǎo)致重新渲染,如何解決?

這篇具有很好參考價(jià)值的文章主要介紹了React--》React組件變化每次都會導(dǎo)致重新渲染,如何解決?。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

目錄

React.memo

useCallback

useMemo


React.memo

React組件會在兩種情況下下發(fā)生渲染

第一種:當(dāng)組件自身的state發(fā)生變化時

第二種:當(dāng)組件的父組件重新渲染時

第一種情況下重新渲染無可厚非,state都變化了組件自然應(yīng)該重新進(jìn)行渲染,但是第二種情況似乎并不是總怎么必要,有時候僅僅只需要父組件重新渲染即可,但是其子組件也跟著渲染,如果是很復(fù)雜的邏輯的話,子組件再渲染一遍就會造成資源的浪費(fèi),有什么方法能杜絕這種情況呢?

React.memo()是一個高階組件,它接收另一個組件作為參數(shù),并且會返回一個包裝過的新組件,包裝過的新組件就會具有緩存作用,包裝過后,只有組件的props發(fā)生變化時,才會觸發(fā)組件的重新渲染,否則總是返回緩存中結(jié)果。

如下在父組件App中調(diào)用子組件A,在子組件A中調(diào)用孫組件B,在每個組件當(dāng)中都打印標(biāo)識組件渲染的證明,并且在后代組件中使用React.memo,防止組件的重新渲染,具體的實(shí)現(xiàn)過程如下圖所示實(shí)現(xiàn)的過程。

React--》React組件變化每次都會導(dǎo)致重新渲染,如何解決?

接下來我會將組件渲染的過程一一記錄下來,大家仔細(xì)看看加入了React.memo后,組件渲染會發(fā)生何種變化:

React--》React組件變化每次都會導(dǎo)致重新渲染,如何解決?

可以看到初次渲染時,所有的組件都會被執(zhí)行一次,? 當(dāng)點(diǎn)擊按鈕時,父組件傳遞給子組件A的props值發(fā)生變化導(dǎo)致A組件又被重新渲染一次,接下來僅僅是父組件發(fā)生變化,當(dāng)父組件的值為4的時候會再次導(dǎo)致子組件A的props值發(fā)生變化導(dǎo)致子組件A再次被重新渲染,因?yàn)閷O組件B沒有被傳入props,導(dǎo)致其只有在初次渲染的時候被被渲染,后面即使父組件發(fā)生變化,其也不會重新渲染,具體的過程如上圖所示。

useCallback

useCallback這個API作用也是阻止組件渲染的,不知道大家有沒有設(shè)想過這樣一個場景,當(dāng)子組件調(diào)用父組件的方法去修改父組件身上的值的時候,子組件會不會重新被渲染,答案是會的。在知道這個原因的前提下,你應(yīng)該要明白什么是重新渲染,重新渲染就是整個組件的代碼會被重新執(zhí)行一次,也就是說父組件修改其本身數(shù)值的方法也會被重新執(zhí)行,這就導(dǎo)致了通過props傳遞給子組件其修改父組件的方法被重新執(zhí)行變化了,導(dǎo)致子組件會被再一次被重新渲染,也就是說子組件的頁面沒有發(fā)生任何變化,但是子組件仍被重新渲染了,因此不管是用不用上面講解的React.memo方法,子組件都會被重新渲染,具體效果如下:

React--》React組件變化每次都會導(dǎo)致重新渲染,如何解決?

React--》React組件變化每次都會導(dǎo)致重新渲染,如何解決?

有沒有辦法能夠解決這個問題呢?這就要使用useCallback這個API來解決這個辦法了。

useCallback是一個鉤子函數(shù),用來創(chuàng)建React中的回調(diào)函數(shù),創(chuàng)建的回調(diào)函數(shù)不會總在組件重新渲染時重新創(chuàng)建,具體實(shí)現(xiàn)過程如下:

React--》React組件變化每次都會導(dǎo)致重新渲染,如何解決?

下圖很明顯,第一次創(chuàng)建時所有組件都會渲染一次,當(dāng)修改父組件的值時,使用usecallback之后,其函數(shù)不會再被重新創(chuàng)建,這也就讓其子組件不會再被重新渲染,完美解決問題。

React--》React組件變化每次都會導(dǎo)致重新渲染,如何解決?

useMemo

上面兩個方法都是講解組件與組件之間減少渲染的次數(shù),那么組件自身能不能減少渲染的范圍呢?要知道我們一旦對當(dāng)前組件進(jìn)行數(shù)值修改,當(dāng)前組件就會被重新渲染,也就是說當(dāng)前組件的所有代碼都會被再次執(zhí)行一次,但是再某種場景下,我僅僅是想修改當(dāng)前組件某一處的數(shù)值,并沒有想修改整個組件,但是整個組件都給我渲染一遍,這種是不是也會造成資源的浪費(fèi),給出如下情景:

import React, { useState } from 'react'
const sumFun = (a,b) =>{ 
  console.log('函數(shù)被重新執(zhí)行了');
  return a + b
}
const App = () => {
  const [count,setCount] = useState(0)
  const sum = sumFun(12,14)
  const addHandler = () =>{ 
    setCount(prevState => prevState + 1)    
  }
  return (
    <div>
      <h2>當(dāng)前函數(shù)的和為:{sum}</h2>
      <h3>App根組件--當(dāng)前值為:{count}</h3>
      <button onClick={addHandler}>點(diǎn)擊+1</button>
    </div>
  )
}
export default App

我僅僅是想增加當(dāng)前組件的值,而函數(shù)是寫死的,就是渲染一個數(shù)值而已,但是其被迫跟著整個組件重新渲染了,結(jié)果如下:

React--》React組件變化每次都會導(dǎo)致重新渲染,如何解決?

讓我們設(shè)想這樣一個場景:sumFun函數(shù)冤枉的說:我啥也沒干你憑啥讓我再重新執(zhí)行一次,我: 讓你執(zhí)行就執(zhí)行,廢什么話,隨大流懂不懂,sumFun怒氣沖沖的說:這可是你說的,你不仁別怪我不義了,sumFun懷恨在心打出以下函數(shù):

React--》React組件變化每次都會導(dǎo)致重新渲染,如何解決?

由于sumFun函數(shù)的騷操作,導(dǎo)致整個組件的運(yùn)行被sumFun一人給阻塞掉了,必須等待sumFun執(zhí)行完成,整個組件才會被重新渲染,一個人有問題了,整個組件都需要等待他,這就很被動了,于是我說:sumFun快收了神通吧,有沒有啥辦法能夠解決它啊

React--》React組件變化每次都會導(dǎo)致重新渲染,如何解決?

接下來開始useMemo登場使用,給出如下代碼:

import React, { useState,useMemo } from 'react'
const sumFun = (a,b) =>{ 
  const begin = Date.now() // 獲取當(dāng)前的時間戳
  while(1){
    if(Date.now() - begin > 3000){ // 死循環(huán),必須讓其等待三秒才break出去跳出循環(huán)
      break
    }
  }
  console.log('函數(shù)被重新執(zhí)行了');
  return a + b
}
const App = () => {
  const [count,setCount] = useState(0)
  let a = 100
  let b = 120
  if(count % 10 === 0){
    a+=count
  }
  const sum = useMemo(()=>{
    return sumFun(a,b)
  },[a,b])
  const addHandler = () =>{ 
    setCount(prevState => prevState + 1)    
  }
  return (
    <div>
      <h2>當(dāng)前函數(shù)的和為:{sum}</h2>
      <h3>App根組件--當(dāng)前值為:{count}</h3>
      <button onClick={addHandler}>點(diǎn)擊+1</button>
    </div>
  )
}
export default App

由于sumFun被useMemo包裹,這就導(dǎo)致其只有在a和b發(fā)生變化時才會被重新渲染,如下:

React--》React組件變化每次都會導(dǎo)致重新渲染,如何解決?

并不是以后的項(xiàng)目都需要限制重新渲染,代碼邏輯簡單組件功能少的完全是沒必要的,影響極小,只要在特別情況下或者說項(xiàng)目復(fù)雜要追求效率的場景下,渲染限制組件重新渲染獲取是一個不錯的選擇。文章來源地址http://www.zghlxwxcb.cn/news/detail-420521.html

到了這里,關(guān)于React--》React組件變化每次都會導(dǎo)致重新渲染,如何解決?的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • React中的組件的渲染函數(shù)(Render Function)是什么?什么是React中的函數(shù)組件和類組件?如何在React中進(jìn)行狀態(tài)管理?

    React中的組件可以有多種形式的渲染函數(shù),包括傳統(tǒng)的render()方法,以及近年來興起的函數(shù)組件和Hooks中的useState()和useEffect()。在這篇文章中,我將詳細(xì)介紹渲染函數(shù),以及如何在React中使用它們。 渲染函數(shù)(Render Function)是指組件在生命周期中的一個特殊方法,它的作用是根據(jù)

    2024年02月13日
    瀏覽(26)
  • ?? 強(qiáng)制 Vue 重新渲染組件的正確方法

    有時 Vue 的 reactivity 不符合需求,你需要重新渲染一個組件,或者可能只是想remove當(dāng)前的 DOM 并 re-render。那么如何讓 Vue 以 正確的方式重新加載組件呢? 強(qiáng)制 Vue 重新渲染組件的最佳方法是在組件上設(shè)置一個 :key 。當(dāng)需要重新渲染組件時,只需更改鍵的值,Vue 就會重新渲染組

    2024年02月07日
    瀏覽(24)
  • vue組件中重新渲染的3種方式

    這個是最推薦的。因?yàn)関ue是通過虛擬Dom算法來判斷元素的變化,是否變化的核心是通過判斷新舊元素的key值是否變化。如果你的key是變化的,則重新渲染該元素,如果key沒變,則不會重新渲染。 所以如果你想讓你的組件重新渲染,你給組件加上 key 屬性,然后在需要重新渲染

    2024年02月12日
    瀏覽(21)
  • uniapp轉(zhuǎn)小程序 子組件中修改了父組件傳過來的數(shù)據(jù),子組件沒有重新渲染

    uniapp轉(zhuǎn)小程序 子組件中修改了父組件傳過來的數(shù)據(jù),子組件沒有重新渲染

    昨天在開發(fā)中遇到了一個問題,在小程序中沒有渲染,而在h5中是有渲染出來的。在小程序中,數(shù)據(jù)確確實(shí)實(shí)也是通過接口獲取到了,也儲存到了對應(yīng)的字段里面。并且在子組件中監(jiān)聽了父組件傳過來的數(shù)據(jù),就是只渲染了一次,困惑了很久。對應(yīng)的是最近使用的數(shù)據(jù) ? 因此

    2024年02月15日
    瀏覽(27)
  • react組件多次渲染問題

    問題背景 在數(shù)據(jù)沒有發(fā)生變化的情況下React組件會進(jìn)行數(shù)次重復(fù)渲染,繪制出來完全相同的兩個圖 排查思路 尋找子組件重渲染原因?qū)嶒?yàn) 測試一:在子組件的props未發(fā)生任何變更的情況下是否會發(fā)生重新渲染 測試結(jié)論:子組件即使不接收任何props當(dāng)父組件重新渲染時子組件也

    2024年02月12日
    瀏覽(48)
  • React【React是什么?、創(chuàng)建項(xiàng)目 、React組件化、 JSX語法、條件渲染、列表渲染、事件處理】(一)

    React【React是什么?、創(chuàng)建項(xiàng)目 、React組件化、 JSX語法、條件渲染、列表渲染、事件處理】(一)

    ? ? ? ?React是什么? 為什么要學(xué)習(xí)React? React開發(fā)前準(zhǔn)備? 創(chuàng)建React項(xiàng)目?

    2024年02月11日
    瀏覽(23)
  • 【React】- 組件生命周期連續(xù)渲染兩次問題

    【React】- 組件生命周期連續(xù)渲染兩次問題

    最近在整理生命周期相關(guān)的知識內(nèi)容,然后發(fā)現(xiàn)一個奇怪的現(xiàn)象,即組件的生命周期會運(yùn)行2次!經(jīng)過確認(rèn)不是代碼問題,于是開始找度娘,終于找到其原因-React中的嚴(yán)格模式,在這里記錄一下 一、問題重現(xiàn) 如圖所示,當(dāng)組件初始化渲染時,每個周期都走了2次,按理說初始化

    2024年02月15日
    瀏覽(19)
  • 自定義鼠標(biāo)指針圖案每次開機(jī)或者重啟都會重置的解決辦法

    自定義鼠標(biāo)指針圖案每次開機(jī)或者重啟都會重置的解決辦法

    一款漂亮的鼠標(biāo)指針常常能使我們身心愉快? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ...........................................................................................................................................................? ? ? ? ? ?

    2024年02月11日
    瀏覽(60)
  • Win10每次開機(jī)鼠標(biāo)桌面右鍵都會顯示撤銷刪除解決方法

    Win10每次開機(jī)鼠標(biāo)桌面右鍵都會顯示撤銷刪除解決方法

    Win10每次開機(jī)鼠標(biāo)桌面右鍵都會顯示撤銷刪除解決方法分享。有用戶電腦開機(jī)的時候,就會自動彈出撤銷刪除的窗口了。那么這個問題是怎么回事呢?接下來我們就一起來看看以下的詳細(xì)操作方法教學(xué)吧。 情況一: 如果是聯(lián)想,在聯(lián)想管家把聯(lián)想鎖屏關(guān)了就行了。 情況二:

    2023年04月09日
    瀏覽(84)
  • Pycharm這個更新索引是個什么操作,為什么每次啟動,都會進(jìn)行?

    Pycharm這個更新索引是個什么操作,為什么每次啟動,都會進(jìn)行?

    點(diǎn)擊上方“ Python爬蟲與數(shù)據(jù)挖掘 ”,進(jìn)行關(guān)注 回復(fù)“ 書籍 ”即可獲贈Python從入門到進(jìn)階共10本電子書 今 日 雞 湯 九重城闕煙塵生,千乘萬騎西南行。 大家好,我是皮皮。 一、前言 前幾天在Python最強(qiáng)王者交流群【吳超建】問了一個 Pycharm 操作的問題,這里拿出來給大家分

    2024年02月01日
    瀏覽(31)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包