#javascript #reactjs
#javascript #reactjs
Вопрос:
Я, наконец, начинаю понимать, как передавать и извлекать данные с помощью React. Но у меня есть одна проблема, у меня есть этот обработчик кликов this.SortASC
когда я нажимаю на заголовок, я хотел бы отсортировать заголовки в алфавитном порядке.
Я изо всех сил пытаюсь заставить это работать .. есть идеи, как я могу это исправить?
Заранее благодарю.
Мой код:
import React, { Component } from 'react';
import { getMovies } from '../services/fakeMovieService';
class Movies extends Component {
state = {
movies: getMovies(),
};
handleDelete = movie => {
const updateMovies = this.state.movies.filter(m => m._id !== movie._id); // Display all movies but not the one selected.
this.setState({
movies: updateMovies,
});
};
SortASC = () => {
console.log('Sorted');
};
render() {
return (
<React.Fragment>
{this.state.movies.length > 0 ? (
<div className="m-2">
<p>
Showing {this.state.movies.length} in the database.
</p>
<table className="table table-striped table-dark">
<thead>
<tr>
<th scope="col" onClick={this.SortASC}>
Title
</th>
<th scope="col">Genre</th>
<th scope="col">Stock</th>
<th scope="col">Rate</th>
<th scope="col">amp;nbsp;</th>
</tr>
</thead>
<tbody>
{this.state.movies.map(movie => {
const {
_id,
title,
genre,
numberInStock,
dailyRentalRate,
} = movie;
return (
<tr key={_id}>
<th>{title}</th>
<td>{genre.name}</td>
<td>{numberInStock}</td>
<td>{dailyRentalRate}</td>
<td>
<button
onClick={() =>
this.handleDelete(movie)
}
className="btn btn-danger btn-sm">
Delete
</button>
</td>
</tr>
);
})}
</tbody>
</table>
</div>
) : (
<h4 className="m-4">
There are no movies in the database.
</h4>
)}
</React.Fragment>
);
}
}
export default Movies;
Комментарии:
1. Я не уверен, что вы пытаетесь сделать.
2. NVM Я думаю, что сделанное редактирование легче понять
3. Вы захотите использовать это. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference /…
4. не могли бы вы, пожалуйста, показать, как данные выглядят в вашем состоянии?
Ответ №1:
Вы можете просто отсортировать movies
массив по состоянию в SortASC
.
Вот так:
SortASC = () => {
const { movies } = this.state;
this.setState({
movies: movies.sort((a, b) => a.title > b.title ? 1 : -1)
})
};
И если вы хотите отсортировать по убыванию, вы можете поменять местами 1
и -1
.
Комментарии:
1. Да благословит тебя Бог, мой друг. Работает как по волшебству, еще один вопрос, как я могу отменить свое действие после второго нажатия?
2. Это решение разрушает исходный порядок, поэтому вы могли бы сохранить исходные фильмы без изменений, но затем также иметь
displayMovies
массив в состоянии, которое фактически было бы отображено. Итак, для сброса вам понадобится также переменная, чтобы проверить, отсортирован ли порядок в данный момент, и если да, то скопируйте оригиналmovies
вdisplayMovies
, иначе скопируйтеmovies.sort
вdisplayMovies
, но это, возможно, становится немного сложнее. Возможно, лучший способ сделать это — просто предложить другие способы сортировки фильмов вместо отмены (например, alphabeticalDesc, numberInStock).3. Вы правы! Продолжайте в том же духе, я создам несколько фильтров для рейтинга жанра и названия, а также для акций! Приветствия!
Ответ №2:
вы хотите что-то вроде: arr.sort((titleA, titleB) => titleA - titleB)
хотя это может стать немного сложнее (проверка на одинаковые / повторяющиеся заголовки и т.д.)