iT邦幫忙

2022 iThome 鐵人賽

DAY 23
0
自我挑戰組

前端菜鳥的react初體驗系列 第 23

前端菜鳥的react初體驗 Day23-Hook-useCallback(2)

  • 分享至 

  • xImage
  •  

昨天提到,useCallback不會重新渲染的特性是他的一大特色,
但結果昨天試用了一下,好像其實也跟一般的funcion沒什麼差別。

那到底重點是什麼呢?
以下是一個會陷入無限環圈的案例,一樣可以一眼掠過。

const ChildComponent = ({ count, add }) => {
      useEffect(() => {
        add()
      }, [ add ]);

      return (
        <div onClick={add}>
          {count}按我
        </div>
      )
}

const App = () => {
  const [count, setCount] = useState(0);
  
   const add = () => {
      console.log('test')
      setCount((pre) => pre + 1)
  }

  return (
    <div>
      <ChildComponent count={count} add={add} />
    </div>
  )
}

const root = ReactDOM.createRoot(document.querySelector('#root'));
root.render(<App />);

首先,我們先建立一個子組件,在這個component裡面,我們綁了一個onClick事件叫做add,是一個計數器,會讓count+1。
並且用了useEffect來執行這個動作。

const ChildComponent = ({ count, add }) => {
      useEffect(() => {
        add()
      }, [ add ]);

      return (
        <div onClick={add}>
          {count}按我
        </div>
      )
}

接著在父層先設好count,然後建立function讓count+1,為了讓一切更清楚,也console.log('test')來看一下呼叫的情形。
最後在父層呼叫剛剛具有點擊事件的子層並把變數跟函式都傳遞過去。

const App = () => {
  const [count, setCount] = useState(0);
  
   const add = () => {
      console.log('test')
      setCount((pre) => pre + 1)
  }

  return (
    <div>
      <ChildComponent count={count} add={add} />
    </div>
  )
}

然後
https://ithelp.ithome.com.tw/upload/images/20221008/20152660L03TlYkk4D.png

哈哈哈哈停不下來了哈哈哈哈哈哈哈。
沒錯,因為我們不斷地呼叫函數-改變count-觸發re-render-渲染-呼叫函數.........。
(誰來支援一下上次那張梗圖)

這時候,我們就需要把一般函式變成useCallback,因為他不會觸發re-render
所以可以終止這個無限的迴圈。

  const getData = useCallback(() => {
      console.log('test')
       setCount((pre) => pre + 1)
  }, [])

所以,當我們需要有父組建、子組建,並且需要避免不斷的重複render的話,
useCallback就是一個很好的東西。

那麼,我們明天見吧!
(要來去看演唱會惹)
(誰在乎?)

參考資料
https://israynotarray.com/react/20220928/3362055744/
https://ithelp.ithome.com.tw/m/articles/10270317


上一篇
前端菜鳥的react初體驗 Day22-Hook-useCallback
下一篇
前端菜鳥的react初體驗 Day24-Hook-useMemo
系列文
前端菜鳥的react初體驗30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言