Для предотвращения повторного рендеринга react-window
каждого элемента в списке вам необходимо:
- Запоминание функции рендеринга строк
- Переместить эту функцию за пределы области действияродительская функция
- Используйте опору
itemData
для связи между родительским компонентом и функцией рендеринга для каждой строки.
Эта стратегия используется в примере с песочницей в окне реагирования здесь: https://codesandbox.io/s/github/bvaughn/react-window/tree/master/website/sandboxes/memoized-list-items
Вот пример использования вашего кода: https://codesandbox.io/s/a-quick-react-tree-component-based-on-react-window-8psp0
Возможно, существует более простой способ сделать это, используя useMemo
, но я не смог понять это.
Если вы исследуете узлы DOM с помощью инструментов разработчика Chrome, вы увидите, что узлы DOM больше не воссоздаются для всего дерева при развертывании одного узла.Это устраняет мерцание, которое вы видели раньше (в Chrome, но не в Firefox) при выборе нового узла.
Но есть и кое-что еще, что мешает вашей анимации вращения работать должным образом.В приведенном выше примере CodeSandbox я добавил анимацию к свойствам border
, чтобы показать, как работает анимация некоторых свойств CSS, но анимация свойств transform
CSS не работает.Я подозреваю, что эта проблема не имеет ничего общего с react-window
, поэтому вы, вероятно, захотите отладить ее отдельно, чтобы выяснить, почему ваши преобразования не анимируются, но другие свойства анимируются нормально.