我具有发送电子邮件的功能。但是状态不会针对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);
});
}
}
我该如何解决?
答案 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])