关于React useCallback使用的问题?-灵析社区

半寸时光爱思考

## React中的useCallback 下面的代码中`Com`是父组件,`Button`是子组件,子组件接收父组件的`count2`和`setCount2`,子组件中使用了`memo(Button)`导出 function Com() { const [count1, setCount1] = useState(0) const [count2, setCount2] = useState(0) const handleClick1 = () => {setCount1(i => i + 1)} const handleClick2 = () => {setCount2(i => i + 1)} // const callbackSetCount2 = useCallback(() => { // setCount2(i => i + 1) // }, [count2]) console.log("$$ ComA render") return ( this is ComA {count1} setCount1(i => i + 1)}>count1 ++ count2 {count2} ) } 子组件`Button` function Button({ handleClick, children }) { console.log(`$$ Rendering button` + children) return ( this is Button.jsx {children} ) } export default memo(Button) 在上面的代码中,如果点击`count1++`的按钮(不使用useCallback),父组件会重新渲染,但是子组件也会刷新,然而子组件中的`count2`依赖没有变化,所以只能是`handleClick2`函数变化了,这只能是因为父组件重新渲染导致了`const handleClick2 = () => {setCount2(i => i + 1)}`这一行重新运行。 所以我们需要使用`useCallback`来将`handleClick2`函数缓存,不会因为重新渲染而导致没有必要的刷新,这样做之后,点击`count1++`的按钮也不会导致子组件刷新了。 这是我对上面代码以及重新渲染机制以及`useCallback`的理解,这样理解对吗? 希望理解`useCallback`以及`setState`之后的更新机制,谢谢各位大佬了

阅读量:13

点赞量:0

问AI
因为 (()=>{}) !== (()=>{}) 所以当"prop"中有函数 作为依赖项 的时候,"React.memo"会失去效果,无论你做了父组件啥都会触发更新 所以用"useCallBack"去封装一次函数就可以达到你要的效果 同理在"useMemo"也是一样的 所以在新手学习"React-hook"的时候"官网" (https://link.segmentfault.com/?enc=da23jlqnp89Johy1QhkjNQ%3D%3D.LpEYpHUV%2FllNLMmofBbONVUjrn9GHC%2BGMTC5QPpJvzX%2BnyG2VyfDRaDmJkKHVCNQjFBi8D%2Bj823BCoF4tNnayw%3D%3D)都会强烈建议打开"eslint-plugin-react-hooks"