【问题标题】:React useEffect caused infinite loopReact useEffect 导致无限循环
【发布时间】:2021-11-01 10:32:27
【问题描述】:

我在使用useEffect时搜索了很多关于无限循环的帖子,但仍然无法弄清楚

在 useEffect 中,我尝试调用 get accounts api,当然,我放了一个空数组,因为我只希望它在渲染后运行一次。但目前我喜欢添加“addAccount”功能。所以,如果我按下添加按钮,那么它会发送一个发布请求。问题来了,我想检查值是否改变,所以我将值放入第二个参数,即空数组,它会导致无限循环。但是,如果我保留空数组,我的屏幕不会重新渲染。

export default function BC() {
  const [value, setValue] = useState([])

  async function getBCAccount() {
    const result = await axios.get("http://localhost:3004/accounts")
    if(result) {
      setValue(result.data)
    }
  }
  
  async function createBCAccount() {
    const result = await axios.post("http://localhost:3004/accounts", {
      id: 5,
      name: "mmm"
    })
  }
  
  useEffect(()=> {
    getBCAccount()
  }, [])

  const handleAddAccount = () => {
    createBCAccount()
  }

  return (
    <BcContainer>
      <button onClick={handleAddAccount}>add</button>
      {value && value.map((v)=> (
        <AccountContainer key={v.id} to={`/bc/${v.id}`}>
          <p>{v.name}</p>
          <p>{v.coin} BTC</p>
        </AccountContainer>
      ))}
    </BcContainer>
  )

【问题讨论】:

    标签: javascript reactjs http-post use-effect


    【解决方案1】:

    我认为您只需在 createBCAccount 内调用 getBCAccount。在create之后,你会再次调用get数据来更新你的value

      async function createBCAccount() {
        await axios.post("http://localhost:3004/accounts", {
          id: 5,
          name: "mmm"
        })
        getBCAccount()
      }
    

    【讨论】:

    • 您甚至不需要调用getBCAccount(),因为它会再次调用get 到端点。由于post 请求已经返回了一个包含所有帐户的结果,所以我只需在该结果上调用setValue
    • 你确定post already returns a result containing all the accounts,
    • post请求的结果不包含所有账户,只包含已发布的数据。而且,为什么我无法检测到 useEffect 的第二个参数中的值变化。因此,如果值发生变化,则重新渲染。或者,我误解了 useEffect 的工作原理。
    • 我的错,我猜错了。在使用 value 变量的新数据完成渲染周期后(在使用新结果调用 setValue 之后),效果将运行。您的组件的工作方式,基于值变量的变化同步(重新运行效果)是没有意义的,因为post 不依赖它。根据您所说的,Viet 的回答对我来说似乎是合理的,我会同意的。我可能会将 get 重命名为 refreshAccounts 之类的名称,但这是风格。
    猜你喜欢
    • 2020-08-27
    • 2020-11-16
    • 2021-02-19
    • 2021-09-27
    • 2020-11-14
    相关资源
    最近更新 更多