Автоматически обновлять компонент при удалении элемента

Проблема

У меня есть код, который удаляет компонент. Это работает, но когда я нажимаю кнопку удаления, мне нужно перезагрузить браузер, чтобы увидеть, что он удален.

Есть ли способ сразу показать страницу без этого элемента? Я пробовал несколько вещей, но у меня ничего не получается. Является ли ререндер единственной душой??? Может быть, мне следует использовать управление состоянием, например, 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;

Я думаю, ваша проблема не в этих строках кода, где вы храните список альбомов? вам следует обновить список альбомов, чтобы внести изменения в массив, чтобы вы увидели, что элемент удален.

thelonglqd 23.12.2020 21:55

Почему handleDeleteasync если ты ничего await не делаешь? Какой/где ваш источник правды, из которого вы рендерите свой пользовательский интерфейс? Если вы оптимистично обновите это, ваш пользовательский интерфейс будет почти «синхронизирован» с серверной частью.

Drew Reese 23.12.2020 21:55

когда вы что-то удаляете, установите свое состояние и удалите этот объект из своего массива, чтобы он удалялся в реальном времени.

Nisharg Shah 23.12.2020 21:56

@NishargShah — это библиотека для реагирующих запросов.

Kuba Kluzniak 23.12.2020 21:58

Прежде всего, не перезагружайте свою веб-страницу каждый раз, когда что-то удаляете. Он снова загрузит весь код вашего сайта. Вместо того, чтобы сохранять ваши данные в состоянии и обновлять состояние, это вызовет повторный рендеринг, который является лучшим решением, чем перезагрузка. Повторный рендеринг покажет ваши изменения в реальном времени, и это тоже с молниеносной скоростью, поэтому вместо этого используйте повторный рендеринг. перезарядки

Siddharth Agrawal 23.12.2020 22:24

Но если вы все еще хотите перезагрузить, то после того, как вы успешно удалили что-то, позвоните: window.location.href = "ваш URL", это перезагрузит вашу страницу.

Siddharth Agrawal 23.12.2020 22:27
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
6
307
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не думаю, что вам нужно что-то вроде редукса для этого.

Чтобы обойти вашу проблему, я бы сделал следующее:

В главном компоненте обновите константу альбома до const [albums, setAlbums] = useState(data.data);

Создайте функцию в основном компоненте:

const handleDelete = id => {
    setAlbums(albums => albums.filter(album => album._id != id));
}
  • Обратите внимание, что теперь альбомы являются переменной состояния, создание нового массива с фильтром вызовет повторную визуализацию компонента при вызове handleDelete.

В компоненте карты примите новую опору с именем 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)

И точно так же у вас должна быть функциональность, которую вы запрашиваете. Дайте мне знать, если есть какие-либо проблемы!

Другие вопросы по теме