Как отобразить и добавить похожий элемент в список элементов из API в React.js?

Диаграмма компонентов

У меня есть компонент с именем ListItem, который имеет 7 полей (компонентов), игнорирует диаграмму, у него всего 4, все они реагируют на выбор компонента, а также имеют значок сохранения и удаления для каждого ListItem. Я использую контекст, где я установил lists=[] , в useEffect я установил списки в массив объектов, которые я получил от API. У меня есть списки компонентов, которые отображают этот компонент ListItem с помощью функции карты. Теперь я хочу добавить еще один список перед первым ListItem , я могу это сделать, и в базе данных создается запись. Я реализовал нумерацию страниц, и при нумерации страниц я добавляю все элементы списка, которые у меня есть в состоянии, вместе с элементами, которые возвращаются из API, поскольку продукт, который я добавляю, был вставлен в базу данных, поэтому при вызове API для последней страницы я также получаю данные, которые я добавил вверху, поэтому я вижу одни и те же данные дважды. 1) Когда я нажал «Добавить продукт» 2) Как последний элемент списка с момента добавления записи в базу данных. Каков будет правильный подход к таким сценариям. Пожалуйста, игнорируйте, если я не могу понять, потому что это мой первый вопрос.


person Shivraj Nag    schedule 13.01.2021    source источник


Ответы (1)


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

С точки зрения пользовательского опыта, я думаю, хорошо показывать элемент, который они только что добавили, вверху, даже если он на самом деле не принадлежит этой странице. Я бы стилизовал его по-другому (возможно, с более темным цветом фона), чтобы указать, что это добавленный элемент, а не настоящий элемент списка.

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

Вот некоторый псевдокод того, как я бы справился с этим.

const List = () => {
  
  // store the current page (or possibly store it in the context)
  const [page, setPage] = useState(1);

  // some hook which accesses API data via context
  // should refresh the API fetch when the page changes
  const items = useListPage(page);

  // store items which were added while on this page
  const [addedItems, setAddedItems] = useState([]);

  // clear added items on page change
  useEffect(() => {
    setAddedItems([]);
  }, [page]);

  return (
    <div>
      <AddForm
        // AddForm component would handle the POST request
        // if successful, add that item to the List state via onSuccess callback
        onSuccess={(object) => setAddedItems([object, ...addedItems])}
      />
      {addedItems.map((item) => (
        <ListItem
          {...item}
          key={item.id}
          temporary={true} // some sort of flag to control styling
        />
      ))}
      {items.map((item) => (
        <ListItem
          {...item} 
          key={item.id} 
          temporary={false}
        />
      ))}
      <Pagination 
        page={page}
        setPage={page}
      />
    </div>
  );
};

person Linda Paiste    schedule 24.01.2021
comment
Спасибо за предложение, но у меня также есть еще одно требование: мне нужно добавить элемент при нажатии кнопки, которая появляется при наведении курсора на край каждого элемента, как в программном обеспечении JIRA, мы можем создать проблему на странице невыполненной работы с помощью наведения (точно так же) . - person Shivraj Nag; 25.01.2021
comment
Я предполагал, что фиктивный компонент AddForm (который я не реализовал) справится с этим. Этот компонент будет иметь свойства состояния, такие как isClicked, fields, isPosting и т. д. Сначала вы должны отобразить кнопку. Нажатие (или наведение курсора) на кнопку установит для isClicked значение true, и на основе этого вы скроете кнопку и отобразите форму, в которой вы вводите свойства для своего нового элемента. Вы отправляете форму и получаете ответ от сервера, затем в этот момент вы перезваниваете родительскому компоненту List через реквизит onSuccess, который мы предоставили компоненту AddForm. - person Linda Paiste; 25.01.2021
comment
Разделение забот всегда хорошо. Единственная связь, которая должна происходить между разделом, в котором вы добавляете элемент, и разделом, в котором вы просматриваете список элементов, заключается в том, что список должен знать добавленный элемент, чтобы его можно было отобразить. - person Linda Paiste; 25.01.2021