React hooks之 useCallback的使用
官网:
关于useCallback:
需要明白的是:
1:使用Function组件时会定义很多内部函数,总觉得会影响组件性能,其实不然:看这里:
由于在渲染中创建函数,Hooks 很慢吗? 不会。在现代浏览器中,闭包的原始性能与类相比没有显着差异,除非在极端情况下。
2:Hooks设计使得它更有效
钩子避免了类所需的大量开销,例如在构造函数中创建类实例和绑定事件处理程序的成本。 使用 Hooks 的惯用代码不需要在使用高阶组件、渲染道具和上下文的代码库中普遍存在的深层组件树嵌套。使用更小的组件树,React 要做的工作更少。
3:React.memo 和 React.useCallback 一定记得需要配对使用,缺了一个都可能导致性能不升反“降”
useCallback:
const memoizedCallback = useCallback(fn, deps) fn :一个函数最终会返回该回调函数,该回调函数仅仅只在 deps 参数发生改变时才会更新 deps :数组;用于触发 fn 回调函数改变的参数列表。
例子
import React, { useState } from react; import { Space, Button } from antd; export default function Index() { const [count, setcount] = useState(0); const ShowTime = () => { console.log(now time : + new Date()); }; return ( <> <h1>index:{count}</h1> <Space> <Button type="primary" onClick={() => setcount(count + 1)}> increase </Button> <ChildComponent fn={ShowTime} /> </Space> </> ); } const ChildComponent = (props) => { console.log(child render!); return ( <Button type="primary" onClick={props.fn}> showTime </Button> ); };
这里其实是有问题的,count并没有传递给子组件,但是count得值变化了,子组件也更新了,这不是我们想要的
用useCallback,memo改进
import React, { useState, memo, useCallback } from react; import { Space, Button } from antd; export default function Index() { const [count, setcount] = useState(0); /** * 把原来的showTime函数放在useCallback中 */ const countCallback = useCallback(() => { console.log(now time : + new Date()); }, []); return ( <> <h1>index:{count}</h1> <Space> <Button type="primary" onClick={() => setcount(count + 1)}> increase </Button> <ChildComponent fn={countCallback} /> </Space> </> ); } const ChildComponent = memo((props) => { console.log(child render!); return ( <Button type="primary" onClick={props.fn}> showTime </Button> ); });
当我们更新count的时候,子组件并没有重新渲染
useCallback的第二个参数deps中阔以添加依赖,只有当这些依赖变化时视图才会重新更新