function App() { const [count, setCount] = useState(0) return ( <> <div>{count}</div> <button onClick={() => setCount(count + 1)}>add</button> <Foo /> </> ) }子组件
import { memo } from "react" const Index = () => { console.log('re-render'); return <div>子组件</div> } export default memo(Index)
import { useCallback, useState } from 'react' import Foo from '@/components/foo' import './App.css' // 堆代码 duidaima.com function App() { const request = useCallback(() => { setTimeout(() => { console.log('请求'); }, 10) }, []) // const request = () => { // setTimeout(() => { // console.log('请求'); // }, 10) // } const [count, setCount] = useState(0) return ( <> <button onClick={()=>setCount(count + 1)}>{count}</button> <Foo request={request} /> </> ) } export default App子组件
import { memo } from "react" interface Props { request: () => void } const Index = (props: Props) => { console.log('re-render'); return ( <button onClick={props.request}>按钮</button> ) } export default memo(Index)
三 传递给子组件的引用数据类型需要使用 useMemo 包裹
其实和上面说的传递函数给组件,函数要用 useCallback 包裹起来是同一个道理。函数也是引用数据类型,是一个特殊的对象!
父组件import { useCallback, useMemo, useState } from 'react' import Foo from '@/components/foo' import './App.css' function App() { const obj = useMemo(() => ({ name: 'xiaowang', age: 19 }), []) const [count, setCount] = useState(0) return ( <> <button onClick={()=>setCount(count + 1)}>{count}</button> <Foo obj={obj}/> </> ) } export default App子组件
import { memo } from "react" interface Props { obj: { name: string, age: number } } const Index = (props: Props) => { console.log('re-render'); return ( <button>按钮</button> ) } export default memo(Index)四. hook 使用 useMemo 包裹
function App() { const list = usePow([1,2,3,4]) console.log(list); const list2 = usePow([1,2]) console.log(list2); const [count, setCount] = useState(0) return ( <> <button onClick={()=>setCount(count + 1)}>{count}</button> <Foo /> </> ) }hook
import { useMemo } from 'react'; export default (list: number[]) => { return useMemo(() => list.map(num => { console.log('hook 执行了'); return Math.pow(num, 2) }), []) }