【问题标题】:How do i use Blazor components in the code?如何在代码中使用 Blazor 组件?
【发布时间】:2020-07-05 17:17:31
【问题描述】:

我正在尝试完成类似于以下代码的操作,但我似乎无法弄清楚如何去做。

@page "/"

<div>@test</div>
@code {
[Parameter]
public string Animal { get; set; }

private BaseComponent test { get; set; }

protected override async Task OnInitializedAsync()
{
    switch (Animal)
    {
        case "Cat": test = <Cat>Fluffy</Cat>; break;
        case "Dog": test = <Dog>Woff</Dog>; break;
        default: test = <p>None</p>
    }
}

我还希望能够将组件放入像 new Dictionary&lt;string, BaseComponent&gt; { {"cat", &lt;Cat&gt;test&lt;/Cat&gt; }} 这样的字典中

有什么想法吗?

【问题讨论】:

标签: c# razor blazor


【解决方案1】:

使用 RenderFragments 是可能的:

private Dictionary<string, RenderFragment> switcher 
  = new Dictionary<string, RenderFragment>(StringComparer.CurrentCultureIgnoreCase)
{
    {  "cat" , __builder => { <Cat> It's a Cat </Cat> } },
    {  "dog" , __builder => { <Dog> It's a Dog </Dog> } },

};

然后在@code之外,

@switcher["Cat"]

但如果这是最好的解决方案,很大程度上取决于具体的用例,以及使用&lt;Animal&gt; 标签时需要多大的灵活性。

例如,您可以将上面的内容替换为 &lt;ShowAnimal Animal="Cat" /&gt; 组件,并在标记部分中使用(大)switch 语句来实现它。

【讨论】:

  • 请注意,您只能在.razor 文件中执行此操作。你不能在后面的代码中做到这一点(.razor.cs
  • 是的,这显然取决于剃须刀编译器。在部分类中,您将不得不使用builder.OpenComponent(...) 类型的代码。这在某些情况下可能更可取。
【解决方案2】:

渲染片段字典:

@_content

@code {

    [Parameter]
    public string Animal { get; set; }

    RenderFragment _content => Animal switch
    {
        "Cat" => @:@{ <Cat>Fluffy</Cat> } 
,
        "Dog" => @:@{ <Dog>Woff</Dog> } 
,
           _  => @:@{ <p>None</p> } 
    };

}

注意:

由于解析错误,开关逗号当前必须位于下一行。

【讨论】:

    猜你喜欢
    • 2021-12-14
    • 2019-09-30
    • 1970-01-01
    • 1970-01-01
    • 2020-12-14
    • 2021-08-16
    • 2019-06-13
    • 2020-09-12
    相关资源
    最近更新 更多