удаление должно проходить в 2 этапа:
1. помечаешь удаляемый элемент спец флагом "isDeleted" (в этом состоянии средствами css запускаешь анимацию исчезновения)
2. по окончании анимации удаляешь элемент из state полностью
...
onDeleteItem(index) {
const users = this.state.users;
users[index].isDeteted = true;
this.setState({
users,
});
setTimeout(() => {
users.splice(index, 1);
this.setState({
users,
});
}, 300);
}
...
{this.state.users.map((user, index) => (
<UserItem
className={user.isDeteted ? 'class-for-deleted' : ''}
onDelete={this.onDeleteItem.bind(this, index)}
/>
))}
...
уровень senior: в данном механизме асинхронное изменение state, поэтому для стабильно работающего кода необходимо добавить проверку, что процесс удаления закончился (чтобы не было коллизий между несколькими быстрыми кликами "удалить"), а так же на существование текущего компонента (что он не размонтировался из dom-дерева)