Я пытаюсь преобразовать простой компонент React с обратным вызовом this.setstate в функциональный компонент с useState / useEffect, но я не могу воспроизвести ту же функциональность с последним.
Я использую пример простой системы предупреждений / уведомлений для добавления и удаления предупреждений после тайм-аута. Песочница здесь:
https://codesandbox.io/s/class-and-function-callback-comparison-54tus?file=/src/index.js
соответствующий код для сравнения:
const NoticesWithFunctionCallback = () => {
const [state, setState] = useState({
alerts: [],
show: false
});
const addNotice = (e) => {
setState({
alerts: [...state.alerts, ""]
});
};
useEffect(() => {
(async () => {
await timeout(3000);
console.log("timeout occurred");
const newAlerts = tail([...state.alerts]);
setState({
alerts: newAlerts
});
})();
}, [state.alerts]);
return (
<div className="App">
<h3>
Notices using function component with UseState and UseEffect callback
</h3>
<Generator addNotice={addNotice} />
<Container>
{state.alerts.map((item, index) => (
<Alert>some alert here</Alert>
))}
</Container>
</div>
);
};
class NoticesWithClassCallback extends React.Component {
state = {
alerts: [],
show: false
};
addNotice = (e) => {
this.setState(
{
alerts: [...this.state.alerts, ""]
},
async () => {
await timeout(3000);
console.log("timeout occurred");
const newAlerts = tail([...this.state.alerts]);
this.setState({
alerts: newAlerts
});
}
);
};
render() {
return (
<div className="App">
<h3>Notices using class component and setState callback</h3>
<Generator addNotice={this.addNotice} />
<Container>
{this.state.alerts.map((item, index) => (
<Alert>some alert here</Alert>
))}
</Container>
</div>
);
}
}
Я надеюсь получить предложения о том, как заменить правильно работающий компонент обратного вызова setstate компонента класса на функциональный компонент с использованием usestate / useeffect.
Любые предложения приветствуются.