在昨天我们学会使用memo去记忆我们的组件,达成避免re-render的状态。
而我们今天会学习使用useCallback,来解决reference的问题。
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)
HI,到了第二天,感觉每天写一篇文章的感觉真的会有一种怠惰感,还是好好习惯吧 什麽是 React 先...
回圈结构是高阶语言其中一项重要的发展,回圈事实上结合了低阶语言的部分功能,使得程序部分的叙述区块能够...
教授说12点前要看到实验结果,但我组长看我不先发文,也想把我杀了,人真难做,我只好先来发文QQ 心得...
在前一篇提到,可以利用 epublib 将网页内容储存成 epub 档案,便於事後用其他的阅读软件中...
架构是解决方案最重要的工件,它是从各种观点或角度看一个东西(即解决方案)所产生的概念、逻辑和物理呈...