React-таблица не отображает данные о новых данных

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

На этом первом снимке экрана данные были сначала извлечены из базы данных для заполнения таблицы.

Затем здесь, после того, как источник события отправил сообщение, сообщение выводится на консоль, но таблица пуста.

Ниже приведена часть кода для создания таблицы, в частности, useEffect, подключающийся к источнику событий.

const [tableData, setTableData] = useState([]);
const [tableColumns, setTableColumns] = useState<
  { Header: string; accessor: never }[]
>(new Array<{ Header: string; accessor: never }>());

// connect to event source to get real time data from msg broker
useEffect(() => {
  const eventSource = new EventSource(SseApiUrl);

  eventSource.onmessage = (event) => {
    const newData = JSON.parse(event.data).payload;
    console.info(newData);
    const newTableData = tableData;
    newTableData.push(newData as never);
    setTableData(newTableData);
  };

  return () => {
    eventSource.close();
  };
}, [SseApiUrl]);

const data = useMemo(() => tableData, [tableData]);
const columns = useMemo(() => tableColumns, [tableColumns]);

const tableInstance = useTable({ columns, data });
const { getTableProps, getTableBodyProps, headerGroups, rows, prepareRow } = tableInstance;
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
0
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

На самом деле, немного поговорив с

Основная проблема заключалась в использовании эффекта для источника события. Мне нужно было создать новый массив, и в моей предыдущей реализации const newTableData = TableData по-прежнему указывает на TableData в памяти.

Две другие более мелкие проблемы: во-первых, мое количество столбцов из новых данных было неправильным, во-вторых, данные, помещенные в таблицу, на самом деле были строкой, а не объектом JSON.

Ниже приведены изменения, которые я сделал:

useEffect(() => {
  const eventSource = new EventSource(SseApiUrl);

  eventSource.onmessage = (event) => {
    const newData = JSON.parse(event.data).payload;
    const newTableData = [...tableData]; // create a new copy of the array
    newTableData.push(JSON.parse(newData) as never); // add the new data to the new copy
    setTableData(newTableData); // set the new copy as the state
  };

  return () => {
    eventSource.close();
  };
}, [SseApiUrl, tableData]);

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