使用 React 的useCallback
hook 本质上只是一个useMemo
专门用于函数的包装器,以避免在组件的 props 中不断创建新的函数实例。我的问题来自何时需要将争论传递给从记忆创建的回调。
例如,像这样创建的回调......
const Button: React.FunctionComponent = props => {
const onClick = React.useCallback(() => alert('Clicked!'), [])
return <button onClick={onClick}>{props.children}</button>
}
是记忆化回调的一个简单示例,不需要将外部值传递给它来完成其工作。但是,如果我想为React.Dipatch<React.SetStateAction>
函数类型创建一个通用的记忆回调,那么它将需要参数......例如:
const Button: React.FunctionComponent = props => {
const [loading, setLoading] = React.useState(false)
const genericSetLoadingCb = React.useCallback((x: boolean) => () => setLoading(x), [])
return <button onClick={genericSetLoadingCb(!loading)}>{props.children}</button>
}
在我看来,这似乎与执行以下操作完全相同......
const Button: React.FunctionComponent = props => {
const [loading, setLoading] = React.useState(false)
return <button onClick={() => setLoading(!loading)}>{props.children}</button>
}
这将使记忆函数的目的落空,因为它仍然会在每次渲染时创建一个新函数,因为它也会在每次渲染时genericSetLoadingCb(false)
返回一个新函数。
这种理解是否正确,或者用参数描述的模式是否仍然保持记忆的好处?