[英]How to asynchronously set state in useState hook React
我想更改 var 值,該值在超時后使用useState
鈎子初始化。 實現這一目標的正確方法是什么? 這是我的嘗試:
const [msg, setMsg] = useState("Hello");
const changeMsg = () => {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve("Buy");
}, 1000);
});
};
useEffect(() => {
setMsg(async () => {
const res = await changeMsg();
return res;
});
}, []);
您可以使用以下代碼實現此目的:
import { useEffect, useState } from "react";
import "./styles.css";
export default function App() {
const [msg, setMsg] = useState("Hello");
const changeMsg = () => {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve("Buy");
setMsg("Another Value");
}, 1000);
});
};
useEffect(() => {
changeMsg();
}, []);
return <div className="App">Message is: {msg}</div>;
}
變量 msg 的值在 1 秒后更改為另一個值。
由於評論中的另一個答案和解決方案缺少一個相當重要的東西,這是我對這個問題的看法:
const [msg, setMsg] = useState("Hello");
useEffect(()=>{
const timeout = setTimeout(()=>{
setMsg("Buy");
}, 1000);
return ()=>clearTimeout(timeout);
}, []); //only run on first render
return (
<div className="App">Message is: {msg}</div>
)
每當你在一個效果鈎子中使用異步的東西時,你應該提供一個清理函數。 即使在這里,鈎子只運行一次。
為什么? 因為否則,如果在超時運行之前卸載組件,則會出現錯誤。
import React , {useState,useEffect} from 'react' import "./styles.css"; export default function App (){ const [msg,setMsg] = useState("Hello"); useEffect(() => { const clear = setTimeout(() => setMsg("Busy"),2000); return () => {clearTimeout(clear)} },[]) return(<div> <h1>{msg}</h1> </div>) }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.