suchen

Heim  >  Fragen und Antworten  >  Hauptteil

useState nicht aktualisiert

Können Sie mir sagen, warum mein useState immer noch leer ist? Es möchte es nicht aktualisieren. Ich verwende setInteraval und eine Funktion zum Aktualisieren von Daten und möchte useState zum aktuellen Zeitpunkt festlegen, aber useState ignoriert formatTime in setTimeOut(res) . Können Sie mir sagen, wie ich das Problem beheben kann?

EDIT: Wenn ich die Nummer in useState stecke

const [timeOut, setTimeOut] = useState(30)

Es erscheint für eine Sekunde und verschwindet dann und ich habe leere Felder. Es scheint, als ob setInterval alles darin löscht. Wie kann man das Problem beheben?

const Timer = ({item}) => {

  const [timeOut, setTimeOut] = useState('')  // << doent want to update it from 
                                              //         formatTime function
  console.log(timeOut) // still empty


useEffect(() => {
    if (status !== 'unPaid') return;

    const timer = window.setInterval(() => {
        setTimeOut(formatTime(createdAt));
    }, 1000);

    return () => window.clearInterval(timer);
}, [createdAt, status]);



const formatTime = (time) => {
         console.log(time) //  2023-07-25T23:39:39.253Z

         // const timer = new Date(time).getTime() + 1800000
          const timer = new Date(time).getTime() + 250000
          let countDown = new Date().getTime()
          let distance = timer - countDown

          let min = Math.floor((distance % (1000*60*60) / (1000*60)))
          let sec = Math.floor((distance % (1000*60) / (1000)))
          let res = Math.abs(min) + ':' + Math.abs(sec)
          console.log(res)   //  4:50
          setTimeOut(res)   // <<<<<   it doesnt want to apdate my useState
           
 }

P粉245003607P粉245003607442 Tage vor554

Antworte allen(2)Ich werde antworten

  • P粉103739566

    P粉1037395662023-09-15 17:42:24

    这很可能是因为您在超时内设置状态。

    另一个问题是您在其内部调用 setTimeout。

    相反,使用一个根据先前状态返回新值的函数。

    useState 接受一个函数,该函数接收 previousState 作为参数

    const [count, setCount] = useState(0);
    
    useEffect(() => {
      window.setTimeout(() => {
        setCount((prevValue) => {
          return prevValue + 1; // what you return here, will be the new state.
        })
      }, 1000)
    }, []);

    Antwort
    0
  • P粉990008428

    P粉9900084282023-09-15 09:23:00

    看起来问题是 setInterval 每秒运行一次,并且每秒更新状态(timeOut)。

    此外,在formatTime函数中,您使用的是当前时间(new Date().getTime())而不是createdAt时间。因此,状态每秒不断更新为新值。

    这是更新后的代码。

    const Timer = ({ item }) => {
      const [timeOut, setTimeOut] = useState('');
    
      useEffect(() => {
        if (status !== 'unPaid') return;
    
        const timer = window.setInterval(() => {
          setTimeOut(formatTime(createdAt));
        }, 1000);
    
        return () => window.clearInterval(timer);
      }, [createdAt, status]);
    
      const formatTime = (time) => {
        const timer = new Date(time).getTime() + 250000;
        const currentTime = new Date().getTime();
        const distance = timer - currentTime;
    
        let min = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
        let sec = Math.floor((distance % (1000 * 60)) / 1000);
        let res = Math.abs(min) + ':' + Math.abs(sec).toString().padStart(2, '0');
        return res;
      };
    
      return <div>{timeOut}</div>;
    };

    Antwort
    0
  • StornierenAntwort