Reactjs 为什么带有空依赖项数组的useCallback不返回相同的函数?

Reactjs 为什么带有空依赖项数组的useCallback不返回相同的函数?,reactjs,react-hooks,usecallback,Reactjs,React Hooks,Usecallback,我正在尝试编写一个定制的React钩子,它返回的函数在每次调用钩子时都保持引用相等。这意味着每次都从钩子返回完全相同的函数,因此将它们与==进行比较将返回true 我的印象是,这是实现这一目标的途径: 函数useCorrectCallback(){ const[count,setCount]=useState(0) 让增量=()=>setCount(c=>c+1) 让memonized=useCallback(增量,[]) 返回{ 计数 增量:记忆化 } } 因此,当调用这个钩子时,我相信返回

我正在尝试编写一个定制的React钩子,它返回的函数在每次调用钩子时都保持引用相等。这意味着每次都从钩子返回完全相同的函数,因此将它们与
==
进行比较将返回
true

我的印象是,这是实现这一目标的途径:

函数useCorrectCallback(){
const[count,setCount]=useState(0)
让增量=()=>setCount(c=>c+1)
让memonized=useCallback(增量,[])
返回{
计数
增量:记忆化
}
}
因此,当调用这个钩子时,我相信返回值的
increment
属性每次都应该是完全相同的函数。它应该是第一次运行钩子时内联函数的值,并且在后续执行钩子时不会更改,因为我没有为
useCallback
[]
指定依赖项

但事实并非如此!我已经写了一篇文章来说明这个问题。以下是问题的关键:

函数validateFunctionEquality(hookResult){
//存储运行挂钩的最后结果
让存储={…hookResult}
//强制重新渲染以再次运行挂钩
expect(hookResult.count).toEqual(0)
动作(hookResult.increment)
expect(hookResult.count)。toEqual(1)
//将以前的结果与当前结果进行比较
expect(hookResult.constant).toEqual(stored.constant)
expect(hookResult.increment).toEqual(stored.increment)
}
为了验证我的测试是否准确,我还编写了一个钩子,它只使用一个全局范围的对象来维护“内存”,而不是试图要求React使用
useCallback
来完成它。此挂钩通过以下测试:

let memoryHack={}
函数useMemoryHack(){
const[count,setCount]=useState(0)
让增量=()=>setCount(c=>c+1)
memoryHack.increment=memoryHack.increment | | increment
返回{
计数
增量:memoryHack.increment
}
}

我是否错误地使用了
useCallback
?为什么
useCorrectCallback
在后续执行时在其
increment
属性中返回不同的函数?

我怀疑是
enzyme
的问题。可能与

通过使用
挂载
,您的测试按原样通过:

  act(() => {
    componentMount = mount( // used mount instead of shallow
      <Component>
        {hookValues => {
          copyHookValues(hookResult, hookValues)
          return null
        }}
      </Component>
    )
  })
act(()=>{
componentMount=mount(//使用了mount而不是shallow
{hookValues=>{
copyHookValues(hookResult、hookValues)
返回空
}}
)
})