Проблема:
if (this.state.isSorted) {
employeeResults = this.state.sortedResults;
}
Когда вы сортируете, вы устанавливаете для state.isSorted
значение true, однако вы никогда не устанавливаете его обратно в false после завершения. Когда вы затем пытаетесь фильтровать, вы делаете фильтр:
if (this.state.isSearchEmpty) {
employeeResults = this.state.result;
} else {
employeeResults = this.filterResults(this.state.result);
}
if (this.state.isSorted) { // this is never reset after sorting.
employeeResults = this.state.sortedResults;
}
Но так как this.state.isSorted
все еще имеет значение true, вы снова используете значения в this.state.sortedResults
.
пожалуйста, дайте мне знать, если что-то очевидно, я делаю не так
Вы делаете это для себя непросто, поскольку вы фильтруете / сортируете один и тот же набор данных. Вот почему вам нужно выполнить действие при рендеринге, поскольку вы пытаетесь сохранить исходный список для последующего использования.
Если вы разделите список на две коллекции: исходный неизмененный и список отображения, вы всегда можете обратитесь к исходному списку для выполнения фильтрации / сортировки.
componentDidMount() {
API.search().then(results => {
const tableData = results.data.results.map((res, i) => ({
image: res.picture.large,
firstName: res.name.first,
lastName: res.name.last,
phone: res.phone,
email: res.email,
dob: res.dob.date,
key: i
}));
this.setState({ originalResults: tableData, displayResults: tableData });
});
}
Затем фильтрация может быть выполнена, как только произойдет onChange
:
onChange = e => {
const query = e.target.value;
this.setState(prevState => ({
displayResults:
query.length > 0
? this.filterResults(query, prevState.originalResults)
: prevState.originalResults
}));
};
и аналогично для сортировки, который может быть выполнен с отображением результатов, а не с целым, что означает, что теперь вы можете сортировать отфильтрованные результаты.
Я создал здесь пример https://codesandbox.io/s/sad-cannon-d61z6
I уничтожил все недостающие функции.