【问题标题】:What's the recommended way of rendering a Blazor component dynamically?动态呈现 Blazor 组件的推荐方法是什么?
【发布时间】:2020-01-30 01:00:24
【问题描述】:

我是 Blazor 的新手,具有基本的 Angular 和 Vue.js 经验。我想渲染一个多态组件列表:

<ul>
    @foreach (fruit of fruits) 
         <li>HOW DO I RENDER FRUIT HERE??? </li> // render the fruit component
</ul>

@code {
   // Each member in the list is a subtype of Fruit
   var fruits = List<FruitComponent> {
       new PearComponent(),
       new AppleComponent()'
       new BananaComponent(),
       new RasberryComponent()
}

据我所知,有几种方法可以实现这一目标,但每种方法都有自己的缺点。一个不常见的建议是使用未记录的 API 调用,这可能会在没有通知的情况下被弃用,但它似乎几乎是理想的。另一个建议在代码中发出标记,这会带回编写 ASP.NET 服务器控件的乏味。最后,最常见的建议是使用条件标记,虽然非常简单,但它将渲染代码与它正在渲染的组件耦合在一起。

我读过的大部分文档可能已经过时并且不再相关。随着 Blazor 的正式发布,实现这一目标的推荐方法是什么?

【问题讨论】:

  • 你想在???? 上做什么?
  • @HenkHolterman,我只想渲染水果
  • 好的,我忽略了 Componet 后缀。但是你怎么写这些?只是带有 BuildRenderTree() 的类,还是你想写一个 PearComponent.razor ?因为这与 ctor 参数 afaik 不押韵。
  • @HenkHolterman。我想渲染组件的剃刀文件。我将修改代码。是的,我不知道你不能使用 ctor。我在使用 Web 框架时遇到的一个问题是,它们经常迫使您围绕语言内置的 OO 工具进行工作。

标签: blazor blazor-server-side


【解决方案1】:

您必须创建一个 RenderFragment,并将其用作多态组件的渲染器...我已将默认 Blazor 的模板 Counter 组件用作父组件 (CounterParent),然后 CounterChild 继承了 CounterParent。我希望它有帮助!问候!

@page "/"

@foreach (CounterParent counter in components)
{
    RenderFragment renderFragment = (builder) => { builder.OpenComponent(0, counter.GetType()); builder.CloseComponent(); };
    <div>
        <div>Before the component</div>
        @renderFragment
        <div>Afterthe component</div>
    </div>
}

@code
{
    List<CounterParent> components = new List<CounterParent>() { new CounterParent(), new CounterChild() };
}

【讨论】:

  • 欢迎您!您在哪里读到它不受官方支持?这是 blazor 的核心概念 afaik!
  • 我在我的组件中使用 CSS Isolation。类没有被加载..你有什么想法,我该如何解决这个问题?
【解决方案2】:

您可以使用 switch 语句来检查类型。 您可以在每种情况下放置组件,或者按照您的喜好渲染您的 li。

<ul>
    @foreach (fruit in fruits)
    {
        switch(fruit)
        {
            case PearComponent p:
                <PearComponent ParameterOfSomeSort="p"></PearComponent>
                <li>Or render pears like this, if you want the li in it</li>
                break;
            case AppleComponent a:
                <AppleComponent></AppleComponent>
                break;
            case BananaComponent b:
                <BananaComponent></BananaComponent>
                break;
            case RaspberryComponent r:
                <RaspberryComponent></RaspberryComponent>
                break;
        }
    }
</ul>

【讨论】:

  • 正如我所提到的,这个特殊的解决方案虽然简单,但与所有 ComponentFruit 子类型耦合,而不仅仅是 ComponentFruit。因此,您不能在运行时注入 FruitComponent 的未知子类型。看来 Blazor 团队在这个问题上犯了错误。
猜你喜欢
  • 2021-07-10
  • 1970-01-01
  • 1970-01-01
  • 2020-06-20
  • 1970-01-01
  • 2011-10-18
  • 1970-01-01
  • 2022-12-04
  • 1970-01-01
相关资源
最近更新 更多