Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/475.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在有效钩子中将setState钩子设置为类属性时无限循环_Javascript_Reactjs_React Hooks - Fatal编程技术网

Javascript 在有效钩子中将setState钩子设置为类属性时无限循环

Javascript 在有效钩子中将setState钩子设置为类属性时无限循环,javascript,reactjs,react-hooks,Javascript,Reactjs,React Hooks,我在React组件中有一个Effect钩子,它设置并初始化一个用于与后端服务器通信的类: constsignalprovider=({url,children})=>{ 让[sigErr,setSigErr]=useState(“”) let[token,setToken]=useContext(TokenContext) let[signaller,setSignaller]=useState() useffect(()=>{ 如果(!信号员){ 常量s=新信号器(url,(err)=>set

我在React组件中有一个Effect钩子,它设置并初始化一个用于与后端服务器通信的类:

constsignalprovider=({url,children})=>{
让[sigErr,setSigErr]=useState(“”)
let[token,setToken]=useContext(TokenContext)
let[signaller,setSignaller]=useState()
useffect(()=>{
如果(!信号员){
常量s=新信号器(url,(err)=>setSigErr(err))
设置信号器(s)
}
if(令牌和信号器){
信令器.设置令牌(令牌)
signaller.setSetTokenCallback(setToken)//添加此行会导致无限循环
信号员连接
}
},[url,标记,信号器,setToken,authError])
...
}
但是,添加行
signaller.setSetTokenCallback(setToken)
会导致无限的重新渲染循环。没有这条线,它就可以正常工作

setSetTokenCallback所做的一切是:

setTokenCallback(f){
this.setTokenCallback=f
}
我认为这不重要


防止循环的最佳方法是什么?

我认为你的罪魁祸首就在这些方面

signaller.setToken(token) // first possible culprit
signaller.setSetTokenCallback(setToken)
由于您正在
useffect
内设置令牌,并且您的
useffect
取决于
令牌
值,以便再次进行重新评估。如果
标记
值与前一个不同,则它将使
使用效果
重新渲染

[url, token, signaller, setToken, authError] // second possible culprit

此外,您应该从条件数组中删除对象或数组类型变量
[url,token,signaller,setToken,authError]
,或者将它们字符串化,或者找到某种方法进行比较,因为对象和数组不能直接进行比较。如果直接比较,它们总是返回false。因此,您的
useffect
将重新运行。

我认为您的罪魁祸首就在这些行中

signaller.setToken(token) // first possible culprit
signaller.setSetTokenCallback(setToken)
由于您正在
useffect
内设置令牌,并且您的
useffect
取决于
令牌
值,以便再次进行重新评估。如果
标记
值与前一个不同,则它将使
使用效果
重新渲染

[url, token, signaller, setToken, authError] // second possible culprit

此外,您应该从条件数组中删除对象或数组类型变量
[url,token,signaller,setToken,authError]
,或者将它们字符串化,或者找到某种方法进行比较,因为对象和数组不能直接进行比较。如果直接比较,它们总是返回false。因此,您的
useffect
将重新运行。

您是否尝试过使用“useCallback()”钩子


您是否尝试过使用“useCallback()”钩子


是的,我认为我的主要问题是将
signaller
作为依赖项-这是一个对象是的,我认为我的主要问题是将
signaller
作为依赖项-这是一个对象