在第一次点击时,它提供null,但在第二次点击时,它通过react中的axios生成API获取结果

wqsoz72f  于 2023-02-22  发布在  iOS
关注(0)|答案(2)|浏览(141)

我的代码中有一个搜索按钮,它将gatewayId作为用户的输入。当用户单击搜索按钮时调用Displaydata函数。然后,它通过setToggle状态使另一个div的可见性为真,并调用loadDetails函数。它通过axios使setdetails等于获取的详细信息。

const displaydata = (e) => {
    setToggle(true);
    loadDetails();
    console.log(details);
  };
  

  const loadDetails = async()=>{
    await axios.get(`http://localhost:8282/changeShipmentDetails/${gatewayId}`)
    .then((response)=>{
        setToggle(true);
        setdetails(response.data);
    })
    .catch(error=>{
        setToggle(false);
        setMsg(error.response.data);
      
    });
  };

但是在第一次点击的时候,它提供了null,然后在第二次点击的时候,它在控制台中产生了结果。如何修复它?

dwthyt8l

dwthyt8l1#

React对状态更新进行批处理,当您执行setState时,它不会反映在控制台日志的下一行代码中。它已经对状态更新进行了批处理,在第一次单击时,它获取的是当前的状态still,该状态为null。
你可以做一些沿着的事情

setDetails(() => {
    console.log(response.data)
    return response.data
})

这应该会显示您所期望的内容,还需要删除displaydata函数中的setToggle,因为它是在loadDetails函数中调用的

t30tvxxf

t30tvxxf2#

这是因为你没有等到结果被读取,而且,当你在displayData函数中使用console.log()时,它总是显示初始数据,而不是更新的数据,要使用console.log记录更新的数据,你需要在外部记录它:

const displaydata = (e) => {
  setToggle(true);
  await loadDetails();
  console.log('data fetched') // With the await in the line above, this line waits until the data is fetched
};

console.log(details); // This will console log data once it's fetched.
  

const loadDetails = async()=>{
  await axios.get(`http://localhost:8282/changeShipmentDetails/${gatewayId}`)
    .then((response)=>{
      setToggle(true);
      setdetails(response.data);
  })
  .catch(error=>{
      setToggle(false);
      setMsg(error.response.data);    
  });
  return true
};

相关问题