Выбор строки с использованием forEachNode очень медленный - PullRequest
0 голосов
/ 20 февраля 2019

Я использую AG Grid React.У меня есть тысяча строк данных.Я пытаюсь выбрать диапазон строк на основе их индексов.

    gridOptions.api.forEachNode(node => {
        if (node.childIndex >= startIndex && node.childIndex < endIndex) {
            node.setSelected(true)
        }
    });

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

Ответы [ 3 ]

0 голосов
/ 22 февраля 2019

Убедитесь, что вы не подписаны ни на какие события, которые могут привести к замедлению работы вашего кода, например, onRowSelected, onSelectionChanged.Они запускаются для каждого

node.setSelected (true)

Если у вас есть какое-либо из этих подписанных событий, один из возможных способов решения этой проблемы - отписаться передцикл, а затем повторно подписаться после цикла.

Кроме того, в зависимости от вашего варианта использования вы можете использовать

forEachNodeAfterFilter (node)

для того, чтобы только проходить через видимые узлы вместо

forEachNode (узел)

0 голосов
/ 25 февраля 2019

Проблема - setSelected(newValue) отправляет события.Когда мы делаем это в цикле для тысячи элементов ( скажем ) - происходит тысяча событий, тысячи запросов в очереди на асинхронное обновление в React, которые могут быть учтены за всю задержку.

Я исправил это, используя другую версию setSelected - setSelected(newValue, clearSelection, suppressFinishActions).К сожалению, это не написано в официальной документации.Идея состоит в том, чтобы использовать эту версию для всего, кроме последнего выбора, чтобы все отправки событий были подавлены и использовать обычный выбор, который мы использовали всегда, чтобы выбрать последний элемент, чтобы он также вызывал необходимые событиядля onRowSelected, onSelectionChanged и т. д. для нормальной работы.

        this.api.forEachNodeAfterFilter(node => {
            if (node.childIndex >= startIndex && node.childIndex < endIndex) {
                selectedNodes.push(node);
            }
        });

        if (selectedNodes.length > 0) {
            // setSelected re-renders every time so use suppressFinishActions except last one
            for (let i = 0; i < selectedNodes.length - 1; i++) {
                selectedNodes[i].setSelected(true, false, true);
            }
            selectedNodes[selectedNodes.length - 1].setSelected(true);
        }
0 голосов
/ 20 февраля 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...