你能在 blazor 中制作抽象组件吗

Gro*_*fit 2 asp.net asp.net-core blazor

Blazor 现在似乎支持某种形式的继承,但没有明确的文档围绕它抽象样式组件是可能的。

例如,假设我希望能够<DynamicComponent>在页面上插入 N 个元素,我需要能够预先知道它们公开了哪些道具以及如何填充它们。

因此,理想情况下,我希望强制任何制作此类组件的人始终具有以下字段:

@code {
   [Parameter] public abstract EventCallback OnSomeMandatoryEvent {get;}
   [Parameter] public abstract ISomeInterface Data {get;}
}
Run Code Online (Sandbox Code Playgroud)

这样我就可以确定我想要引入的组件将始终公开约定所需的属性。

那么这个用例是否受支持?

Gro*_*fit 8

对于来这里寻找 Blazor 抽象类信息的其他人,您可以执行以下操作:

public abstract class CustomElementComponent : ComponentBase
{    
    [Parameter]
    public EventCallback<string> SomeEvent { get; set; }

    [Parameter]
    public SomeModel Data { get; set; }

    protected override Task OnInitializedAsync()
    {
        // whatever
        return base.OnInitializedAsync();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它:

@inherits CustomElementComponent

<div class="field">
  <label class="label">Text To Show</label>
  <div class="control">
    <input class="input" type="text" @bind="Data.Text">
  </div>
</div>

@code {
    // All lifecycles from abstract class have been run and Data is available
}
Run Code Online (Sandbox Code Playgroud)

我很难找到专门围绕此问题的任何文档,因此虽然答案中上面的接口很好,但有时您需要一个抽象类,因为您也可以连接到那里的生命周期方法,从而允许您在基础层创建约定。

还值得注意的是,您还可以在抽象类上使用泛型并将其添加到使用组件中,如下所示@inherits CustomElementComponent<SomeType>