Проблема
У меня есть код, который удаляет компонент. Это работает, но когда я нажимаю кнопку удаления, мне нужно перезагрузить браузер, чтобы увидеть, что он удален.
Есть ли способ сразу показать страницу без этого элемента? Я пробовал несколько вещей, но у меня ничего не получается. Является ли ререндер единственной душой??? Может быть, мне следует использовать управление состоянием, например, redux.
const CardWithEdit = ({
width,
height,
bckImg,
color,
children,
link,
editLink,
id,
}) => {
const [state, setState] = useState(false);
const handleClick = () => setState(!state);
const handleDelete = async () => {
await fetch(`http://localhost:5000/api/v1/albums/${id}`, {
method: "DELETE",
});
handleClick();
};
return (
<Card width = {width} height = {height} bckImg = {bckImg}>
<AlbumtTitle color = {color}>{children}</AlbumtTitle>
<LinkButton background = {color} to = {link}>
See more
</LinkButton>
<IconWrapper>
<div>
<Link to = {editLink}>
<AiOutlineEdit />
</Link>
</div>
<div onClick = {handleClick}>
<AiOutlineDelete
style = {{
cursor: "pointer",
}}
/>
</div>
</IconWrapper>
{state && (
<Dialog
handleClick = {handleClick}
handleDelete = {handleDelete}
deleteText = {"Delete"}
/>
)}
</Card>
);
};
И основной компонент Albums.js
import React from "react";
import Loader from "../components/Loader";
import CardWithEdit from "../components/Card/CardWithEdit";
import ErrorMessage from "../components/ErrorMessage";
import { CartWrapper } from "../components/Wrappers";
import { apiStates, useApi } from "../hooks/useApi";
const Albums = () => {
const { state, error, data } = useApi("http://localhost:5000/api/v1/albums");
const albums = data.data;
switch (state) {
case apiStates.ERROR:
return <ErrorMessage>{error || "General error"}</ErrorMessage>;
case apiStates.SUCCESS:
return (
<CartWrapper>
{albums.length > 0 ? (
albums.map((album) => (
<CardWithEdit
width = {"23rem"}
height = "16rem"
color = {album.color}
bckImg = {album.bckImgUrl}
key = {album._id}
link = {`/albums/${album._id}`}
editLink = {`edit/${album._id}`}
id = {album._id}
>
{album.name}
</CardWithEdit>
))
) : (
<h1>No albums yet</h1>
)}
</CartWrapper>
);
default:
return <Loader />;
}
};
export default Albums;
Почему handleDelete
async
если ты ничего await
не делаешь? Какой/где ваш источник правды, из которого вы рендерите свой пользовательский интерфейс? Если вы оптимистично обновите это, ваш пользовательский интерфейс будет почти «синхронизирован» с серверной частью.
когда вы что-то удаляете, установите свое состояние и удалите этот объект из своего массива, чтобы он удалялся в реальном времени.
@NishargShah — это библиотека для реагирующих запросов.
Прежде всего, не перезагружайте свою веб-страницу каждый раз, когда что-то удаляете. Он снова загрузит весь код вашего сайта. Вместо того, чтобы сохранять ваши данные в состоянии и обновлять состояние, это вызовет повторный рендеринг, который является лучшим решением, чем перезагрузка. Повторный рендеринг покажет ваши изменения в реальном времени, и это тоже с молниеносной скоростью, поэтому вместо этого используйте повторный рендеринг. перезарядки
Но если вы все еще хотите перезагрузить, то после того, как вы успешно удалили что-то, позвоните: window.location.href = "ваш URL", это перезагрузит вашу страницу.
Я не думаю, что вам нужно что-то вроде редукса для этого.
Чтобы обойти вашу проблему, я бы сделал следующее:
В главном компоненте обновите константу альбома до const [albums, setAlbums] = useState(data.data)
;
Создайте функцию в основном компоненте:
const handleDelete = id => {
setAlbums(albums => albums.filter(album => album._id != id));
}
В компоненте карты примите новую опору с именем onDelete
и передайте в нее новую функцию handleDelete
из основного компонента следующим образом:
<CardWithEdit
width = {"23rem"}
height = "16rem"
color = {album.color}
bckImg = {album.bckImgUrl}
key = {album._id}
link = {`/albums/${album._id}`}
editLink = {`edit/${album._id}`}
id = {album._id}
onDelete = {handleDelete}
>
и:
const CardWithEdit = ({
width,
height,
bckImg,
color,
children,
link,
editLink,
id,
onDelete,
}) => {
В функции handleDelete вашего компонента карты после выполнения запроса DELETE просто вызовите onDelete(id)
И точно так же у вас должна быть функциональность, которую вы запрашиваете. Дайте мне знать, если есть какие-либо проблемы!
Я думаю, ваша проблема не в этих строках кода, где вы храните список альбомов? вам следует обновить список альбомов, чтобы внести изменения в массив, чтобы вы увидели, что элемент удален.