Reactjs 与setTimeout/setInterval一起使用Effect可解除警报

Reactjs 与setTimeout/setInterval一起使用Effect可解除警报,reactjs,react-hooks,settimeout,setinterval,use-effect,Reactjs,React Hooks,Settimeout,Setinterval,Use Effect,我试图在一段时间后解除每个警报,但当我尝试调用useEffect中的setTimeout/Interval时,我的警报不会正确显示或解除。目前,总有一个警报不会被解除,因为allAlerts没有持续更新。在useEffect停止更新后,如何添加setTimeout或setInterval来运行checkAlertTimes函数 const [filteredAlerts, setFilteredAlerts] = useState() const checkAlertTimes = () =&g

我试图在一段时间后解除每个警报,但当我尝试调用useEffect中的setTimeout/Interval时,我的警报不会正确显示或解除。目前,总有一个警报不会被解除,因为allAlerts没有持续更新。在useEffect停止更新后,如何添加setTimeout或setInterval来运行checkAlertTimes函数

const [filteredAlerts, setFilteredAlerts] = useState()
const checkAlertTimes = () => {
    const currentTime = new Date().getTime()
    setFilteredAlerts(alertsToday.filter(alert => {
      const alertTime = alert.date.getTime()
      const secondsPassed = (currentTime - alertTime) /1000
      if (secondsPassed < 30){return alert}
    }))
  }

  useEffect(() => {
      checkAlertTimes()
  },[allAlerts])

  return (
    <div>{//map through and show alerts}</div>
  )
const[filteredAlerts,setFilteredAlerts]=useState()
常量checkAlertTimes=()=>{
const currentTime=new Date().getTime()
setFilteredAlerts(警报stoday.filter)(警报=>{
const alertTime=alert.date.getTime()
const secondsPassed=(当前时间-警报时间)/1000
如果(秒间隔<30){返回警报}
}))
}
useffect(()=>{
checkAlertTimes()
},[allAlerts])
返回(
{//映射并显示警报}
)

从这里我看到您需要这样的东西:

const [filteredAlerts, setFilteredAlerts] = useState();
const checkAlertTimes = () => {
  const currentTime = new Date().getTime();
  setFilteredAlerts(
    alertsToday.filter((alert) => {
      const alertTime = alert.date.getTime();
      const secondsPassed = (currentTime - alertTime) / 1000;
      if (secondsPassed < 30) {
        return alert;
      }
    })
  );
};

useEffect(() => {
  const interval = setInterval(() => {
    checkAlertTimes();
  }, 1000);
  return () => clearInterval(interval);
}, [allAlerts, alertsToday]);

return (
  <div>
    {
      //map through and show alerts
    }
  </div>
);
const[filteredAlerts,setFilteredAlerts]=useState();
常量checkAlertTimes=()=>{
const currentTime=new Date().getTime();
setFilteredAlerts(
alertsToday.filter((警报)=>{
const alertTime=alert.date.getTime();
const secondsPassed=(当前时间-警报时间)/1000;
如果(秒间隔<30){
返回警报;
}
})
);
};
useffect(()=>{
常量间隔=设置间隔(()=>{
checkAlertTimes();
}, 1000);
return()=>clearInterval(interval);
},[allAlerts,alertsToday]);
返回(
{
//映射并显示警报
}
);

您尝试过我的解决方案吗?是的!这就是诀窍,但我也想知道,如果filteredAlerts为空,是否有可能使setInterval不每秒运行?为什么
filteredAlerts
?我想你的意思是如果
所有的
都是空的,就停止间隔,对吗?