发生错误3秒后反应setTimeout

丹尼尔·M

我试图让错误在3秒钟后从State数组中删除,这有点工作,但是由于某种原因,它跳回并在1次超时后动作怪异/删除了多个。(在错误功能组件中看到)。

我在状态管理中使用React上下文,希望能得到我的任何帮助。

我将不胜感激任何帮助

您可以在此处实时查看该错误:https : //codesandbox.io/s/flamboyant-jackson-soutv?file=/ src/components/Errors.jsx: 558-567

Errors.jsx

import { 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;

App.js

import "./styles.css";
import { SiteProvider } from "./context/SiteContext";
import Errors from "./components/Errors";

export default function App() {
  return (
    <SiteProvider>
      <div className="App">
        Errors : <Errors />
      </div>
    </SiteProvider>
  );
}

SiteContext.jsx


export const SiteContext = createContext();

export const SiteProvider = props => {
  const [siteSetting, setSiteSetting] = useState({
    errors: []
  });

  return (
    <SiteContext.Provider value={[siteSetting, setSiteSetting]}>
      {props.children}
    </SiteContext.Provider>
  );
};

最好的问候,丹尼尔。

Vivek Doshi

您的代码2个主要问题

首先:不更新最新状态,而更新diff旧状态

 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);
  }, []);

第二:传递索引i,而不是error.id

// here you are passing index, instead of error.id
<Error id={i} error={error.message} />;

解决第一个问题是这会阅读

  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]);

工作演示:

编辑如此删除的增量错误

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

3秒后淡出日期选择器,无反应

来自分类Dev

在Chisel 3中运行“ sbt测试”后发生错误

来自分类Dev

反应:如何纠正“ array.push不是函数”错误,该错误仅在尝试清除状态后发生?

来自分类Dev

建立APK后发生错误

来自分类Dev

发布网站后发生错误

来自分类Dev

Maven打包后发生错误

来自分类Dev

3秒后取消课程

来自分类Dev

3秒后返回的功能

来自分类Dev

SetTimeOut和回发发生后如何关闭模式

来自分类Dev

如何在反应5秒后自动关闭甜蜜警报

来自分类Dev

更改在gdm3登录屏幕中输入错误密码后发生的延迟吗?

来自分类Dev

反应错误 - 渲染方法后的预期分号?

来自分类Dev

错误发生后执行的代码

来自分类Dev

android studio安装后发生错误?

来自分类Dev

如何在 3 秒后打开模态?

来自分类Dev

3 秒后停止 JavaScript 功能

来自分类Dev

点击图片3秒后触发功能

来自分类Dev

输入介绍后发生错误。没有编译错误

来自分类Dev

单击后 3 秒后再次自动单击

来自分类Dev

反应setTimeout钩onclick

来自分类Dev

警报后以setTimeout在Firefox中以错误的顺序执行了代码

来自分类Dev

更新DIV并在1秒后使用setTimeout将其再次清空

来自分类Dev

如何在每 1 秒重复 1 分钟后停止 setTimeout

来自分类Dev

建立ns-3时发生错误

来自分类Dev

Selenium IDE:[错误] 30000毫秒后超时

来自分类Dev

Heroku上的Elixir + Phoenix:15秒后超时错误

来自分类Dev

120秒后,口钳6开启错误

来自分类Dev

重启代理后nginx 30秒502错误超时

来自分类Dev

5秒后显示div消失,验证错误消息