#reactjs #react-router
#reactjs #react-маршрутизатор
Вопрос:
Я пытаюсь отсортировать объект JSON по дате и номеру. Все работает нормально, когда я регистрирую консоль, но состояние не обновляется на стороне графического интерфейса. Чего мне не хватает? Я использую функциональные компоненты. Вот код…
const Posts = () => {
const [dummyData, setDummyData] = useState(Data);
const sortList = (e) => {
if (e.target.value === "date") {
handleSort();
} else if (e.target.value === "upvotes") {
byUpvotes();
}
};
const handleSort = () => {
const sortedData = dummyData.sort((a, b) => {
const c = new Date(a.published);
const d = new Date(b.published);
if (c.getDate() > d.getDate()) {
return c;
} else {
return d;
}
});
setDummyData(sortedData);
console.log(sortedData);
};
const byUpvotes = () => {
const sortByName = dummyData.sort((a, b) => {
return b.upvotes - a.upvotes;
});
setDummyData(sortByName);
console.log(sortByName);
};
return (
<div>
{dummyData.map((post) => (
<PostsItem key={post.id} post={post} />
))}
<div className="row">
<div className="col-s6">
<label>Browser Select</label>
<select className="browser-default" onChange={sortList}>
<option disabled selected>
Choose your option
</option>
<option value="date">Date</option>
<option value="upvotes">Upvotes</option>
</select>
</div>
</div>
</div>
);
};
Комментарии:
1. Вам следует заглянуть в
useEffect
hook.
Ответ №1:
Функция сортировки не создает новый массив, она изменяет старый. Итак, вы изменяете существующее состояние, а затем устанавливаете состояние с тем же массивом. Поскольку это тот же массив, react считает, что состояние не изменилось, и пропускает рендеринг.
Вместо этого вам нужно будет создать копию массива, а затем отсортировать его. Например:
const byUpvotes = () => {
const sortByName = [...dummyData];
sortByName.sort((a, b) => {
return b.upvotes - a.upvotes
})
setDummyData(sortByName)
}
Комментарии:
1. спасибо, что сейчас это работает, но метод handlesort(), который является сортировкой по дате, не сортирует и не обновляет состояние, хотя я сначала добавил его в пустой массив, по-прежнему неправильно сортирует и отображает в состоянии?
2. Ваша функция сортировки должна возвращать число. Положительное число указывает, что оно помещается
b
раньше в массив; отрицательное число помещаетсяa
раньше в массив. В настоящее время вы возвращаете объекты даты (c
иd
)3. Я вернул 1 и -1, но они все еще не сортируются. По крайней мере, оно должно обновить мое состояние, но пока мне не повезло, я экспортировал другие ответы, и они сортируются тем же методом, что и я. . if (c.getDate() > d.getDate()) { return 1; } else { return -1; }
4. Было бы полезно, если бы вы показали, как выглядит код сейчас с этими изменениями. Вы можете отредактировать свой исходный вопрос (не удаляйте старый код, но вы можете добавить дополнительную информацию внизу)
5. Неважно, я решил проблему. Большое вам спасибо 🙂