Максимальная глубина обновления превышена с помощью useReducer в пользовательском крючке, но не с помощью useState

#javascript #reactjs #react-hooks #react-table #react-table-v7

Вопрос:

Пример кода: https://codesandbox.io/s/nice-cherry-z8hn9

Я использую react-таблицу для создания компонента таблицы, который получает объект конфигурации с настройками конфигурация столбцов.

Я создал 2 компонента, a TableInstance и a Table

TableInstance Компонент обрабатывает данные и состояние таблицы, а таблица обрабатывает только рендеринг пользовательского интерфейса.

Я также создал 2 пользовательских крючка, которые обрабатывают состояние и данные в TableInstance компоненте.

Крючок 1, называемый useTableState , имеет простой редуктор, который устанавливает pageSize и текущий page

Крючок 2, называемый useTableData , делает запрос и возвращает данные, плюс он также возвращает конфигурацию столбцов, которая react-table необходима.

Следуя примерам в react-table документах, я создал 2 useEffect крючка ( TableInstance.js строки 33 и 38), которые реагируют, когда состояние таблицы изменяется при разбиении на страницы, когда это происходит, я отправляю действие в useTableState редуктор, которое обновляет состояние, чтобы установить pageSize и page .

Проблема возникает, когда я устанавливаю manualPagination: false . Я получаю Maximum update depth exceeded , потому TableInstance что постоянно перерисовываю. Я не знаю, что вызывает повторную визуализацию. Если вместо использования useReducer Я использую useState , тогда ошибки не происходит. Вы можете проверить это сами, в крючке useTableState я оставил useState комментарий к подходу, если вы просто прокомментируете диспетчеров и раскомментируете состояние набора, то ошибка исчезнет.

Опять же, проблема ТОЛЬКО в использовании manualPagination: false , если я затем использую manualPagination: true управление разбиением на страницы самостоятельно, то проблем нет. Вы также можете попробовать это самостоятельно, изменив конфигурацию в tableConfig файле

Был бы очень признателен за некоторую помощь , так как я немного заблудился здесь, чего я не вижу, что вызывает эту проблему?

TLDR: useReducer в сочетании с разбиением на страницы react-таблицы вызывает бесконечный цикл повторной визуализации, который исправляется, если я изменю подход на useState вместо

Пример кода: https://codesandbox.io/s/nice-cherry-z8hn9

Ответ №1:

Вы пропускаете column переменную в качестве зависимости в useMemo оф useTableData . Добавление этого исправит проблему.

 const tableColumns = useMemo(() => {
    return buildTableColumns(columns);
  }, [columns]);
 

Вот вилка вашей песочницы, показывающая эффект изменения https://codesandbox.io/s/fervent-jepsen-657lm

Комментарии:

1. На самом деле нет, проблема скорее в стороне извлечения данных. Добавление этого мало что решает. Но спасибо!

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

3. То, что вы упомянули, является проблемой с codesandbox, вам нужно вручную перезагрузить страницу с помощью кнопки перезагрузить в левом верхнем углу окна codesancbox

4. Я все еще получаю ошибку при перезагрузке в вашей песочнице, если не добавляю зависимость.