reactjs - 具有依赖关系的 useCallback 与使用 ref 调用函数的最后一个版本
问题描述
在进行代码审查时,我遇到了这个自定义钩子:
import { useRef, useEffect, useCallback } from 'react'
export default function useLastVersion (func) {
const ref = useRef()
useEffect(() => {
ref.current = func
}, [func])
return useCallback((...args) => {
return ref.current(...args)
}, [])
}
这个钩子是这样使用的:
const f = useLastVersion(() => { // do stuff and depends on props })
基本上,与const f = useCallBack(() => { // do stuff }, [dep1, dep2])
此相比,避免声明依赖项列表并且f
永远不会更改,即使其中一个依赖项发生更改。
我不知道如何看待这段代码。我不明白使用useLastVersion
相比有什么缺点useCallback
。
解决方案
这个问题实际上已经或多或少地在文档中得到了回答:https ://reactjs.org/docs/hooks-faq.html#how-to-read-an-often-sharing-value-from-usecallback
有趣的部分是:
另请注意,此模式可能会导致并发模式出现问题。我们计划在未来提供更符合人体工程学的替代方案,但目前最安全的解决方案是,如果某个值取决于更改,则始终使回调无效。
也很有趣的阅读:https ://github.com/facebook/react/issues/14099和https://github.com/reactjs/rfcs/issues/83
当前的建议是使用提供者来避免在 props 中传递回调,如果我们担心会导致过多的重新渲染。
推荐阅读
- python-3.x - 如何通过Python在属性文件中使用带有正则表达式字符串的正则表达式模式进行搜索
- excel - 从所有工作表中获取所有数据
- google-kubernetes-engine - 如何传递 GOOGLE_APPLICATION_CREDENTIALS 中的内容而不是文件路径?
- performance - 通过多个应用脚本对单个 Google 电子表格的并发读取进行基准测试
- php - WAMP 上的 UTF-8 问题,同时使用 MySQL 和 ODBC-AS400
- unit-testing - 无法解析导入语句中的符号测试
- javascript - HTML:属性双引号不起作用-
- rest - 使用 jq 对 JSON 数据进行分区,然后发送 Rest 查询
- python - 如何使用 elasticsearch-dsl-py 在整数字段上创建“介于”条件过滤器?
- python - 层权重的 keras 形状与保存的权重形状不匹配