-
Notifications
You must be signed in to change notification settings - Fork 2.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
【BUG】usePersistFn不能兼容react devtool #728
Comments
感谢反馈,这个 bug 可太奇怪了~ |
@brickspert 你好,请教一下这个问题,背后的原因是什么呢。 |
从代码上看,fnRef.current = useMemo(() => fn, [fn]); 在组件中这样调用: 那么 fn 都是新的函数引用。据我所知 useMemo(callback, [...deps]) , 对于 callback 的调用是同步的。 |
背后的原因还不清楚 |
useLayoutEffect(() => {
fnRef.current = fn;
}); |
讲道理,这个方法也不太行。
useEvent潜在的问题?我的评论 reactjs/rfcs#220 (comment) |
这个产生了 什么问题吗 |
这个产生了什么问题吗?我复现了半天,没搞出来 , 我现在用的版本是concurrent模式 |
|
@brickspert |
那为啥 useInterval 中 fn 不需要用useMemo包呢 |
你的会有什么问题吗,在使用时 |
理论应该反馈给 react 解决 |
他们讨论过了,需要按照 hooks的规则走,就是要将这个 ref 的修改放在useEffect 里面 不能直接在render中修改 |
直接在 effect 里修改也会有问题,比如这个 hook, |
你使用的chakra-ui里面这个hook写了依赖数组吗,他导出的useCallback 这个hook 支持依赖数组的 |
写了 |
如果去掉会不会是正常的呢 |
charkra-ui 的这个 hook 不能去掉依赖吧 const [config, setConfig] = useControlledImmer<ReportConfig>({
value,
onChange,
defaultValue,
})
import { useCallbackRef } from '@chakra-ui/react-use-callback-ref'
import produce, { Draft, freeze } from 'immer'
import { useState } from 'react'
// 这是我自己实现的, 参考 charka-ui 的逻辑
export function useControlledImmer(
props:
){
const {
value: valueProp,
defaultValue,
onChange,
shouldUpdate = (prev, next) => prev !== next,
} = props
const onChangeProp = useCallbackRef(onChange)
const shouldUpdateProp = useCallbackRef(shouldUpdate)
const [uncontrolledState, setUncontrolledState] = useState(
freeze(
typeof defaultValue === 'function' ? defaultValue() : defaultValue,
true
)
)
const controlled = valueProp !== undefined
const value = controlled ? valueProp : uncontrolledState
const setValue = useCallbackRef(
(updater) => {
const nextValue =
typeof updater === 'function'
? produce(value, updater)
: freeze(updater)
if (!shouldUpdateProp(value, nextValue)) {
return
}
if (!controlled) {
setUncontrolledState(nextValue)
}
onChangeProp(nextValue)
},
[controlled, onChangeProp, value, shouldUpdateProp]
)
return [value, setValue]
} |
@fantasticsoul 大概看了一眼感觉好像并没有效果诶?你说的多包了一层是指多套了一个 ref 么, 不过我并没有实际写出来验证过,有兴趣的话要不简单搞个 CodeSandbox demo 试试? |
还是 |
通过 React 的原理盲猜一下吧,首先 React 一直强调 render 必须是纯函数,所谓纯函数就是调用一次和调用一万次没有任何区别,那么就从这个角度想一下有没有 useMemo 有没有可能产生影响 而且可以参考官方说法 ![]() 尤其注意红框的那两个地方 你们现在搞了个 useMemo 给人一种负负得正的感觉 @brickspert @awmleer @fantasticsoul |
而且现在 React 官方已经有这个 hook 了 |
复现步骤
打开下方链接
https://wjl37.csb.app/
点击任意按钮, 计数增加正常

打开react devtool, 并选中计数器所在组件, 点击新增按钮计数不再增加
组件代码如下,也可以点击实例页面右下角开sandbox:
源码进行如下修改可以修复,但是不确定是否会影响现有项目
The text was updated successfully, but these errors were encountered: