反应无法设置反应挂钩的状态

时间:2020-08-21 11:22:36

标签: javascript reactjs react-native react-hooks

我具有发送电子邮件的功能。但是状态不会针对setLoading,setLoading1更新。 Initailly将两个加载都设置为false。控制台 console.log(“ no”,loading,loading1); 返回 no false false 和控制台 console.log(“ load”,loadingState) 返回错误的负载。 所有其他功能均正常运行。

async function submitEmail(pr) {
  let complete = await errorMessageHandler();
  if (complete == "") {
    if (pr == "No") {
      let loadingState = loading;
      console.log("load", loadingState)
      await setLoading(!loadingState);
    } else {
      await setLoading1(true)
    }
    console.log("no", loading, loading1);
    RNSmtpMailer.sendMail({
        mailhost: "mail.oscon.net",
        port: "465",
        ssl: true,
        username: "**********",
        password: "********",
        from: "**********",
        recipients: "************",
        subject: "New Registration From Mobile app",
        htmlBody: emailContent(pr),
        attachmentPaths: [],
        attachmentNames: [],
      })
      .then(success => {
        setLoading(false);
        setLoading1(false);
      })
      .catch(err => {
        setLoading(false);
        setLoading1(false);
      });
  }
}

我该如何解决?

1 个答案:

答案 0 :(得分:0)

setState是一种异步操作,但它不会返回Promise,因此等待它们是毫无意义的,并且代码如下:

const [myState, setMyState] = useState(false)
setMyState(true)
console.log(myState)

只是发送您希望将状态更改为React的愿望,但实际上并没有更改它,无论您是否在此处使用async-await。控制台日志会显示初始值,因为它是主调用堆栈的一部分,而不是异步操作。

如果您想及时了解状态更改,请对基于类的组件使用ComponentDidUpdate,对功能组件使用useEffect挂钩。

const [myState, setMyState] = useState(false)
...
useEffect(()=>{
  console.log(myState) // show when myState is changed
}, [myState])