第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會有你想問的

React set出錯(cuò)時(shí)3秒后超時(shí)

React set出錯(cuò)時(shí)3秒后超時(shí)

守著星空守著你 2022-08-18 10:31:24
我試圖讓錯(cuò)誤在3秒后從State數(shù)組中刪除自己,它有點(diǎn)工作,但由于某種原因,它會跳回去并表現(xiàn)得很奇怪/刪除多個(gè)1超時(shí)完成。(請參閱錯(cuò)誤功能組件)。我使用 React 上下文進(jìn)行狀態(tài)管理,并希望我能得到任何幫助。我將不勝感激任何幫助你可以在這里實(shí)時(shí)查看錯(cuò)誤:https://codesandbox.io/s/flamboyant-jackson-soutv?file=/src/components/Errors.jsx:558-567Errors.jsximport { SiteContext } from "../context/SiteContext";const Error = props => {  const [siteSettings, setSiteSettings] = useContext(SiteContext);  let errors = siteSettings.errors;  console.log("Errors", errors);  let filteredAry = errors.filter(function(obj) {    return obj.id !== props.id;  });  //removed last id , and filteredArray is where we store the new array  console.log("Filtered array", filteredAry);  //after 3 seconds we should update the old array with the new array  useEffect(() => {    setTimeout(() => {      setSiteSettings(siteSettings => ({        ...siteSettings,        errors: filteredAry      }));    }, 3000);  }, []);  return <div className="error">{props.error}</div>;};const Errors = () => {  const [site, setSiteSettings] = useContext(SiteContext);  const addError = () => {    //find the latest id    let max = 0;    if (site.errors.length > 0) {      max = Math.max.apply(null, site.errors.map(item => item.id)) + 1;    } else {      max = 1;    }    console.log("Highest id: " + max);    //add new error to the State,    setSiteSettings(site => ({      ...site,      errors: [...site.errors, { message: "Some error", id: max }]    }));  };  return (    <div id="errors">      Error page      {site.errors.map((error, i) => {        return <Error id={i} error={error.message} />;      })}      <button onClick={addError}>Add error</button>    </div>  );};export default Errors;
查看完整描述

2 回答

?
慕雪6442864

TA貢獻(xiàn)1812條經(jīng)驗(yàn) 獲得超5個(gè)贊

您的代碼有2個(gè)主要問題:


第一:不更新最新狀態(tài),并更新差異舊狀態(tài)


 let errors = siteSettings.errors;

  console.log("Errors", errors);

  // Will provide the old errors, not the updated once

  // so each time you add new error, you will get diff filtered array

  // for 1 you get 0

  // for 2 you get 1

  // ....

  let filteredAry = errors.filter(function(obj) {

    return obj.id !== props.id;

  });

  useEffect(() => {

    setTimeout(() => {

      setSiteSettings(siteSettings => ({

        ...siteSettings,

        errors: filteredAry

      }));

    }, 3000);

  }, []);

第二:傳遞索引,而不是ierror.id


// here you are passing index, instead of error.id

<Error id={i} error={error.message} />;

第一個(gè)問題的解決方案是這個(gè)做閱讀:


  useEffect(() => {

    const id = setTimeout(() => {

      setSiteSettings(siteSettings => {

        // get latest copy of state `siteSettings `

        // and work on that

        let filteredAry = siteSettings.errors.filter(function(obj) {

          return obj.id !== props.id;

        });        

        return {

          ...siteSettings,

          errors: filteredAry

      }});

    }, 3000);

    return () => clearTimeout(id);

  }, [props.id]);


查看完整回答
反對 回復(fù) 2022-08-18
?
波斯汪

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超4個(gè)贊

您必須在卸載時(shí)清除超時(shí)。由于你不清楚,所以每次新的超時(shí)聲明。


useEffect(() => {

    const id = setTimeout(() => {

      setSiteSettings(siteSettings => ({

        ...siteSettings,

        errors: filteredAry

      }));

    }, 3000);

    return () => clearTimeout(id);

  }, []);

您可以像服務(wù)一樣創(chuàng)建它,可以根據(jù)時(shí)間戳刪除舊的消息:


下面是創(chuàng)建消息時(shí)的時(shí)間戳。id


片段:


import React, { useState, useEffect } from "react";

import "./styles.css";

const Errors = () => {

  const [errors, setErrors] = useState([]);

  const [counter, setCounter] = useState(0);

  useEffect(() => {

    const timerId = setInterval(() => {

      if (counter < 10) {

        const id = new Date().getTime();

        // stop generating

        setErrors(ee => ee.concat({ id, message: "Error: " + new Date() }));

      }


      setCounter(counter + 1);

    }, 1000);

    return clearInterval.bind(this, timerId);

  }, [counter]);

  /// clear error

  useEffect(() => {

    const timerId = setInterval(() => {

      setErrors(ee => {

        return ee.filter(({ id }) => new Date().getTime() - id < 3000);

      });

    }, 2000);

    return clearInterval.bind(this, timerId);

  }, []);

  return (

    <ul>

      {errors.map(({ id, message }, i) => {

        return <li key={id}>{message}</li>;

      })}

    </ul>

  );

};

export default function App() {

  return (

    <div className="App">

      <Errors />

      <h2>Start editing to see some magic happen!</h2>

    </div>

  );

}

請檢查粗略樣品:


https://codesandbox.io/s/quiet-dream-mzcmm?file=/src/App.js:0-1084


查看完整回答
反對 回復(fù) 2022-08-18
  • 2 回答
  • 0 關(guān)注
  • 138 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號