1. 程式人生 > >react生命周期遇到的問題

react生命周期遇到的問題

更新 描述 組件 react mage 技術 修改 產生 pan

問題描述:

現象:父組件(容器組件)把redux管理的值傳給子組件(展示組件),在父組件的render中能讀取到this.props.city.cityName的值,我想把這個值通過props傳到子組件中,但是在子組件中

render中能拿到所傳的值,componentDidMount中卻沒獲取到,初步估計是生命周期重新渲染方面的問題

   父組件

    技術分享圖片    

    子組件

    技術分享圖片

    顯示

    技術分享圖片

開始分析:

  技術分享圖片

  將裝載階段的生命周期函數都打印一遍,看看哪個環節能得到值

  結果發現:

  技術分享圖片  

  還真的是發生二次渲染,render在第二次獲得到了數據,而componentDidMount在react組件整個生命周期只觸發一次,剛好沒機會看見render再一次得到值了,那麽也難怪得不到值了

那麽又一個問題了,一般情況,state發生改變會引起當前組件發生第二次渲染,這裏並沒有顯性的使用setState改變state,為什麽也發生了第二次渲染,呃....

  帶著問題再看一遍react生命周期圖

   技術分享圖片

   發現最右邊的情況,父組件更新,會引起組件的二次render,並也會觸發當前組件的componenWillReceiveProps()函數

   寫個demo,驗證一下~,

   情況一: 一般情況

   技術分享圖片 技術分享圖片

  

   展示

   技術分享圖片

   並沒有觸發componenWillReceiveProps()函數

   情況二:此組件情況

   技術分享圖片 技術分享圖片

  

   展示:

   技術分享圖片

   上圖的紅框可以看出,的確是父級組件的更新導致了,現在這個子組件的二次渲染

   至於父級組件更新是怎樣的情況,結合我之前看《深入淺出React和Redux》寫的博文總結:

 只要是父組件的render函數被調用,在render函數裏面被渲染的子組件就會經歷更新過程,

不管父組件傳給子組件的props有沒有改變,都會觸發子組件的componentWillReceiveProps函數

   

   那麽再寫個demo組件進行驗證,加深一下記憶

   技術分享圖片

   父級

   技術分享圖片 技術分享圖片引入了子組件

   子級

  技術分享圖片 技術分享圖片

  

  效果

  技術分享圖片

 

結論:父級初始時調用了render,但是並沒有再次引起子組件的componentWillReceive觸發,也就沒有引起子組件第二次渲染

  修改父組件代碼,打開父組件setState註釋,通過父組件的state改變,來引起第二次render

  技術分享圖片

  取消註釋,效果:

  技術分享圖片

  此時父級組件render之後立馬,觸發了子組件的componentWillReceive,並引起子組件第二次render

  

   結論:父級重新調用render(再次重繪),會引起子組件的componentWillReceive觸發

 題外總結:子組件本身的state改變或父級的二次渲染,都會引發子組件的二次渲染

   

  回歸最原先的父子級組件,又產生了一個問題

  什麽情況導致父級組件進行第二次render,才導致了子組件二次渲染,才導致了我這次的這個問題,父組件代碼如下

  技術分享圖片

  展示:

  技術分享圖片

  父級也被觸發了componentWillReceiveProps,可以推想出祖父級發生了更新操作

  那麽又引發了一個思考,什麽導致祖父級發生了更新操作,通過一個和此時shop組件同根同級別的組件(這個組件沒有引入redux),顯示那個並沒有觸發componentWillReceiveProps這個函數推斷,應該shop組件二次渲染可能與redux有關,再次驗證一下:

  註釋了與引入redux相關的代碼

  技術分享圖片

  

  此時,沒有觸發父級和子級componentWillReceiveProps這個函數

  技術分享圖片

  暫時打住,不繼續“細化”下去了

  再做一個總結:

  引入redux的組件,會引起二次渲染,同時會觸發當前組件的componentWillReceiveProps()函數

  

react生命周期遇到的問題