Reactjs 使用firebase和React路由器进行React useEffect()无限循环

Reactjs 使用firebase和React路由器进行React useEffect()无限循环,reactjs,firebase,authentication,Reactjs,Firebase,Authentication,我看到一些答案说,要只运行一次useEffect,必须给出一个空列表作为第二个参数。这是我的密码 const history = useHistory(); useEffect(() => { console.log('hi') firebase.auth().onAuthStateChanged((user) => { if (user) history.push('/') }) },[]) 首先,linter告诉我

我看到一些答案说,要只运行一次useEffect,必须给出一个空列表作为第二个参数。这是我的密码

  const history = useHistory();
  useEffect(() => {
    console.log('hi')
    firebase.auth().onAuthStateChanged((user) => {
      if (user)
        history.push('/')
    })
  },[])
首先,linter告诉我,“React Hook useffect缺少一个依赖项:‘history’。包括它或删除依赖项数组'。我不理解这一点,因为历史记录已经被删除,因为第二个参数是空数组


第二个控制台无限地记录hi。为什么?

如果使用依赖性,则不能只运行一次使用效果挂钩。每次依赖性改变时,它都会强制钩子重新运行

您必须将历史添加到依赖项列表中,因为您正在useEffect中对历史使用push方法。这是不可谈判的

useEffect(() => {
    console.log('hi')
    firebase.auth().onAuthStateChanged((user) => {
      if (user)
        history.push('/')
    })
  },[history])

如果只想启动一次具有依赖关系的函数,则必须切换回类并使用componentDidMount方法。

在“/”处有什么,以及您试图运行的代码的当前url是什么?@Oo-\uoo在“/”处有一个空页。当前url:“/test”。我正在尝试,如果没有验证重定向逻辑,代码中的某些内容将导致组件卸载并再次装载,这将导致useEffect再次运行,并且再次运行。。。我不熟悉firebase,但如果您可以发布更多代码或完全复制该问题,我将尽力提供帮助