Я пытался создать приложение React с несколькими предупреждениями, которые исчезают через определенное время. Образец: https://codesandbox.io/s/multiple-alert-countdown-294lc
import React, { useState, useEffect } from "react";
import ReactDOM from "react-dom";
import "./styles.css";
function TimeoutAlert({ id, message, deleteAlert }) {
const onClick = () => deleteAlert(id);
useEffect(() => {
const timer = setTimeout(onClick, 2000);
return () => clearTimeout(timer);
});
return (
<p>
<button onClick={onClick}>
{message} {id}
</button>
</p>
);
}
let _ID = 0;
function App() {
const [alerts, setAlerts] = useState([]);
const addAlert = message => setAlerts([...alerts, { id: _ID++, message }]);
const deleteAlert = id => setAlerts(alerts.filter(m => m.id !== id));
console.log({ alerts });
return (
<div className="App">
<button onClick={() => addAlert("test ")}>Add Alertz</button>
<br />
{alerts.map(m => (
<TimeoutAlert key={m.id} {...m} deleteAlert={deleteAlert} />
))}
</div>
);
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
Проблема в том, что если я создаю несколько оповещений, они исчезают в неправильном порядке. Например, тест 0, тест 1, тест 2 должны исчезнуть, начиная с теста 0, теста 1 и т. Д., Но вместо этого тест 1 исчезает первым, а тест 0 исчезает последним.
Я продолжаю видеть ссылки на useRefs, но мои реализации не устраняют эту ошибку.
С помощью @ ehab я думаю, что смог направиться в правильном направлении. В моем коде я получил дополнительные предупреждения о добавлении зависимостей, но из-за дополнительных зависимостей мой код стал работать некорректно. В конце концов я понял, как использовать ссылки. Я преобразовал его в пользовательский хук.
function useTimeout(callback, ms) {
const savedCallBack = useRef();
// Remember the latest callback
useEffect(() => {
savedCallBack.current = callback;
}, [callback]);
// Set up timeout
useEffect(() => {
if (ms !== 0) {
const timer = setTimeout(savedCallBack.current, ms);
return () => clearTimeout(timer);
}
}, [ms]);
}