When designing React components that interact with APIs, such as a "delete record" API, it’s important to consider how state management affects the performance and behavior of your application.
function deleteRecord(id) {
// Optimistically remove the record from UI
updateRecords((currentRecords) => currentRecords.filter(record => record.id !== id));
fetch('/api/records/' + id, { method: 'DELETE' })
.then(response => {
if (!response.ok) {
// Handle failure: inform user and rollback UI changes
alert('Failed to delete the record.');
rollbackChanges(id);
}
})
.catch(error => {
console.error('Error:', error);
rollbackChanges(id);
});
}
function rollbackChanges(id) {
// Rollback UI changes if necessary
}
<script src="https://unpkg.com/react@17/umd/react.development.js" crossorigin></script>
<script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js" crossorigin></script>
<script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
<script type="text/babel">
function App() {
const initialRecords = [
{ id: 1, name: 'Record 1' },
{ id: 2, name: 'Record 2' },
{ id: 3, name: 'Record 3' }
];
const [records, setRecords] = React.useState(initialRecords);
const deleteRecord = (id) => {
const newRecords = records.filter(record => record.id !== id);
setRecords(newRecords);
simulateDeleteAPI(id).then(response => {
console.log('Delete successful:', response);
}).catch(error => {
console.error('Delete failed, re-inserting:', error);
setRecords(currentRecords => [...currentRecords, initialRecords.find(record => record.id === id)]);
});
};
const simulateDeleteAPI = (id) => {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (id === 2) {
reject('Failed to delete due to server error.');
} else {
resolve('Deleted successfully.');
}
}, 1000);
});
};
return (
<div className="container">
<h1>Delete Record API Interaction</h1>
<ul>
{records.map(record => (
<li key={record.id}>
{record.name} <button onClick={() => deleteRecord(record.id)}>Delete</button>
</li>
))}
</ul>
</div>
);
}
ReactDOM.render(<App />, document.getElementById('root'));
</script>