【发布时间】:2023-04-06 11:45:01
【问题描述】:
我正在尝试做一个按名称和年份对 JSON 数组进行排序的按钮。我这样做了,它按年正确排序结果,但我愿意在点击时更改顺序。我还希望可以选择按名称对结果进行排序。
const showResults = movies
.sort((a, b) => (a.Year < b.Year ? -1 : 1))
.map((movie, idx) => {
return (
<div key={idx}>
<div>
<h4>{movie.Year}</h4>
<h3>{movie.Title}</h3>
</div>
</div>
)
我也试过这个,然后点击里面调用它:
const sortResults = movies.sort((a, b) => (a.Year < b.Year ? 1 : -1));
<button onClick={sortResults}>Sort results</button>
编辑:
找到了这个解决方案。它部分有效,但不是我想要的。
首先我做了新的状态钩子:
const [sortResults, setSortResults] = useState('');
选择下拉列表的处理程序:
const sortHandler = (e) => {
setSortResults(e.target.value);
}
然后我在showResults 中编写了新的排序方法。前两部按年份排序,后两部按标题排序:
const showResults = movies
.sort((a, b) => {
if (sortResults === 'newest') {
return (a.Year > b.Year) ? -1 : 1;
}
if (sortResults === 'oldest') {
return (a.Year > b.Year) ? 1 : -1;
}
if (sortResults === 'az') {
return (a.Title > b.Title);
}
if (sortResults === 'za') {
return (a.Title < b.Title);
}
return 0;
}
...
)
然后我为两个排序选项创建了select 下拉列表:
<select onChange={sortHandler} defaultValue='none'>
<option disabled value='none'>Sort</option>
<option value='oldest'>Oldest</option>
<option value='newest'>Newest</option>
</select>
<select onChange={sortHandler} defaultValue='none'>
<option disabled value='none'>Sort</option>
<option value='az'>A-Z</option>
<option value='za'>Z-A</option>
</select>
我想将这些 select 下拉列表交换为按钮并通过单击相同的按钮来更改顺序。示例:我单击年份按钮,订单更改为最新 -> 最旧,我再次单击按钮,订单更改回最旧 -> 最新。该怎么做?
EDIT2:
我试图用这种方式修改sortHandler。当我第一次单击按钮时,值更改为'old',但之后该值不再更改..
const sortHandler = (e) => {
setSortResults(e.target.value);
if (e.target.value === '') {
setSortResults('old');
}
else if (e.target.value === 'old') {
setSortResults('new');
}
}
这是按钮的代码:
<button value='' onClick={sortHandler}>
Sort
</button>
【问题讨论】:
标签: arrays reactjs json sorting