React-Table повторно отображает всю таблицу при выборе

У меня есть относительно стандартная таблица ответов со строками, которые можно selected - реализовано с использованием HOC SelectTable, как и в примере response-table:

https://github.com/tannerlinsley/react-table/blob/v6/docs/src/examples/selecttable/index.js

Ключевое различие в том, что одна из моих колонок - это настраиваемый компонент:

 const columns = [
      {
      ...other columns...
      {
        Header: "Sound file",
        accessor: "sound_file",
        Cell: props => {
          return <SoundFilePlayer url={props.row.sound_file_url} />;
        },

        minWidth: 80
      }
    ];

Компонент SoundFilePlayer является компонентом react-player, который воспроизводит звуковой файл, переданный в компонент как опора. По сути, он загружает переданный URL и отображает звуковой проигрыватель:

Перед загрузкой URL (с продолжительностью по умолчанию 0:00)

введите описание изображения здесь

Затем после загрузки выполняется рендеринг с правильной продолжительностью:

введите описание изображения здесь

Проблема, с которой я сталкиваюсь, заключается в том, что всякий раз, когда в моей таблице выбирается строка, вся таблица перерисовывается (что было бы нормально, если бы не было звукового проигрывателя), то есть проигрыватель звуковых файлов сбросить до 0:00 продолжительности, а затем перезагрузить еще раз с правильной продолжительностью. И это происходит для каждой строки.

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

В любом случае, я повторно визуализирую только выбранную строку, а не всю таблицу? Я просмотрел https://reactjs.org/docs/state-and-lifecycle.html, а также несколько других сообщений SO, но, похоже, не могут только повторно отобразить затронутую строку. Или даже просто повторно отрисовать столбец с флажком?


person adrian    schedule 28.06.2019    source источник
comment
описание немного сложно получить, было бы неплохо использовать кодовый ящик, который воспроизводит проблему.   -  person cubefox    schedule 28.06.2019


Ответы (2)


Итак, я в конце концов нашел решение - просто понизив версию моей таблицы реакций, в частности, до 6.8.6, проблема была решена.

Похоже, что в более поздних версиях появилась ошибка (которая, я сомневаюсь, будет исправлена, учитывая, что сейчас внимание сосредоточено на версии 7).

person adrian    schedule 26.02.2020

Вы можете попробовать запоминать компонент с помощью хука useMemo следующим образом

const file = React.useMemo(() => <SoundFilePlayer url={props.row.sound_file_url} />, [props.row.sound_file_url]);

Он не будет воссоздавать функции компонентов и будет брать их из памяти, если URL-адрес файла не изменится.

person Mike Kor    schedule 28.06.2019