Как компилятор Blazor генерирует порядковые номера? - PullRequest
1 голос
/ 06 июня 2019

Документация Blazor Component рекомендует использовать постоянные порядковые номера при построении пользовательского RenderTree:

Генерация порядковых номеров потеряла всю полезную информацию о том, гдеветки и петли if / else присутствовали в исходном коде.Это приводит к разнице в два раза дольше, чем раньше.... В более реалистичных случаях со сложными и глубоко вложенными структурами, особенно с петлями, затраты производительности оказываются более значительными.Вместо того, чтобы сразу определять, какие блоки или ветви цикла были вставлены или удалены, алгоритм diff должен глубоко проникнуть в деревья рендеринга и, как правило, создавать гораздо более длинные сценарии редактирования, потому что он дезинформирован о том, как старые и новые структуры связаны друг с другом.

Так как же компилятор Blazor определяет значения последовательности для перечисляемых элементов (т.е. элементов, повторяемых в цикле), учитывая, что размер коллекции не может быть определен во время компиляции?

Ответы [ 2 ]

1 голос
/ 07 июня 2019

Ниже показано, как компилятор Blazor компилирует файл .razor с кодом, определяющим элемент таблицы. Обратите внимание, что все элементы, добавленные в цикл, имеют одинаковый порядковый номер

protected override void BuildRenderTree(RenderTreeBuilder builder)
            {
                builder.OpenElement(0, "table");
                builder.OpenElement(1, "tbody");

                for (var row = 0; row < 3; row++)
                {
                    builder.OpenElement(2, "tr");
                    for (var col = 0; col < 3; col++)
                    {
                        builder.OpenElement(3, "td");
                        builder.AddAttribute(4, "class", "tictactoe-cell");
                        builder.CloseElement();
                    }

                    builder.CloseElement();
                }

                builder.CloseElement();
                builder.CloseElement();
            }
        }

Я бы предложил вам определить простой компонент с некоторым текстом («Blazor!») И создать его динамически в другом компоненте, сколько раз пользователь вводил в текстовое поле. Запустите и посмотрите, работает ли он. Теперь перейдите к файлу .g.cs, созданному компилятором, и посмотрите, что изначально создал компилятор. Приходите и расскажите нам о своем эксперименте.

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

Надеюсь, это поможет ...

0 голосов
/ 06 июня 2019

как компилятор Blazor определяет значения последовательности

Это тривиально.Он просто делает seq++, но делает это в генераторе кода, а не в этом сгенерированном коде.

Поэтому, если вы хотите динамически построить дерево рендеринга, вам нужно что-то еще.Как использование белья, как подсказывает этот articel.

...