Day26-useCallback

前言

在昨天我们学会使用memo去记忆我们的组件,达成避免re-render的状态。

而我们今天会学习使用useCallback,来解决reference的问题。

useCallback

syntax

useCallback(() => {
    //block
},[dependency])

我们把昨天的code改成从外部定义好函式,再传递Props。

//App.js
import React, {useState,useCallback} from 'react'
import Button from '../Components/Button'
import Button2 from '../Components/Button2'
function App() {
  const [number, setNumber] = useState(0)
  const [number2 ,setNumber2] = useState(0)

  const increase = () => {
    setNumber(number + 1)
  }

  const increase2 = () => {
    setNumber2(number2 + 1)
  }
  return (
  <div>
    <Button setNumber={increase} value={number} />
    <Button2 setNumber2={increase2} value={number2}/>
  </div>
  )
}

export default App

//Button.js
import React, {memo} from 'react'

function Button({setNumber,value}) {
  console.log('button');

  return (
    <div>
      <button onClick={setNumber}>Click</button>
      {value}
    </div>

  )
}

export default memo(Button)

这时候我们会发现memo没有办法正确的比对参考,也就是函式被重新定义,但会变成不同记忆体位置。

  console.log({} === {}) //false

这时候我们就需要useCallback来记住记忆体位址。


//App.js

import React, {useState,useCallback} from 'react'
import Button from '../Components/Button'
import Button2 from '../Components/Button2'
function App() {
  const [number, setNumber] = useState(0)
  const [number2 ,setNumber2] = useState(0)

  const increase = useCallback(() => {
    setNumber(number + 1)
  },[number, setNumber ])

  const increase2 = useCallback(() => {
    setNumber2(number2 + 1)
  },[number2, setNumber2])
  return (
  <div>
    <Button setNumber={increase} value={number} />
    <Button2 setNumber2={increase2} value={number2}/>
  </div>
  )
}

export default App
// Button.js
import React, {memo} from 'react'

function Button({setNumber,value}) {
  console.log('button');

  return (
    <div>
      <button onClick={setNumber}>Click</button>
      {value}
    </div>

  )
}

export default memo(Button)

//Button2.js
import React, {memo, useState} from 'react'

function Button2({value, setNumber2}) {
  console.log('button2')
  return (
    <div>
      <button onClick={setNumber2}>Click</button>
      {value}
    </div>
  )
}

export default memo(Button2)

总结

  • memo 解决组件的记忆问题
  • useCallback 解决函式参考问题

<<:  [ Day 10 ] - 传值与传址

>>:  Day13 - 辨识模型 part2

Day 02 React ?? Native ??

HI,到了第二天,感觉每天写一篇文章的感觉真的会有一种怠惰感,还是好好习惯吧 什麽是 React 先...

Day4-"回圈"

回圈结构是高阶语言其中一项重要的发展,回圈事实上结合了低阶语言的部分功能,使得程序部分的叙述区块能够...

[LeetCode30] Day30 - END

教授说12点前要看到实验结果,但我组长看我不先发文,也想把我杀了,人真难做,我只好先来发文QQ 心得...

电子书阅读器上的浏览器 [Day16] 网页汇出成 epub 档案 (II)

在前一篇提到,可以利用 epublib 将网页内容储存成 epub 档案,便於事後用其他的阅读软件中...

何谓架构(Architecture)?

架构是解决方案最重要的工件,它是从各种观点或角度看一个东西(即解决方案)所产生的概念、逻辑和物理呈...