【问题标题】:How does the Blazor compiler generate sequence numbers?Blazor 编译器如何生成序列号?
【发布时间】:2019-06-06 17:59:01
【问题描述】:

Blazor Component Documentation 建议在构建自定义RenderTree 时使用常量序列号:

生成序列号已经丢失了所有有用的信息,这些信息是关于 if/else 分支和循环在原始代码中的位置。这导致差异是以前的两倍。 ...在具有复杂和深度嵌套结构的更现实的情况下,尤其是循环,性能成本更加严重。差异算法不是立即识别已插入或删除哪些循环块或分支,而是必须深入递归到渲染树中,并且通常构建更长的编辑脚本,因为它被错误地告知新旧结构如何相互关联。

那么鉴于集合的大小无法在编译时确定,Blazor 编译器如何确定枚举元素(即循环中重复的元素)的序列值?

【问题讨论】:

    标签: c# asp.net-core compilation blazor


    【解决方案1】:

    以下是 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 文件,查看编译器最初生成的内容。快来告诉我们你的实验。

    您的问题非常重要,当我们想要创建例如基于从数据库检索的数据、搜索的配置文件结果列表等的菜单组件时,熟练掌握它是必不可少的。

    希望对你有帮助……

    【讨论】:

    • 有趣,现在我想我想做更多的挖掘,看看这些序列号是如何影响渲染的。文档使它们看起来像是树中元素的一种主键。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-16
    相关资源
    最近更新 更多