2

我的一个剃须刀组件库有问题。

我的组件有一个抽象基类RazorHtmlComponent,它有一个参数属性[Parameter] public string InlineClass { get; set; },用于将 css 类映射到实际组件。然后,每个组件都有另一个基类,其中包含组件特定的属性,其定义如下:abstract class BaseRazorButton: RazorHtmlComponent

我的组件,在这个例子中RazorButton.razor继承自抽象按钮基类BaseRazorButton

问题是,当我实例化一个剃须刀按钮并将属性设置InlineClass为任何值时,它在我的实际RazorButton实例中保持为空。

这是一个最小的代码示例,以便更好地理解:

基类:

public abstract class RazorHtmlComponent : ComponentBase, IRazorHtmlComponent
{
  [Parameter] public string InlineClass { get; set; }

  public DomDefinitionMapper ClassMapper { get; }

  ...

  protected RazorHtmlComponent()
  {
    ClassMapper = new DomDefinitionMapper(InlineClass);
  }

Dom 定义映射器:

  public class DomDefinitionMapper
  {
    public List<Func<string>> DefinitionRepository { get; } = new List<Func<string>>();

    public DomDefinitionMapper(string definition = "")
    {
      if (!string.IsNullOrEmpty(definition))
      {
        DefinitionRepository.Add(() => definition);
      }
    }

    public string GetDefinitions(char separator = default)
      => separator.Equals(default) ? 
          string.Join(" ", DefinitionRepository.Select(i => i()).Where(i => i != null)) 
        : string.Join($" {separator}", DefinitionRepository.Select(i => i()).Where(i => i != null));
  }

按钮基类:

public abstract class BaseRazorButton: RazorHtmlComponent
{
  ...
}

剃刀按钮组件:

@inherits BaseRazorButton

<button class="@ClassMapper.GetDefinitions()">
  @Text
</button>

Razor 按钮的实例化:

<RazorButton InlineClass="page" 
             Text="1"/>

当我在浏览器中检查时,InlineClass未设置使用参数定义的类“页面”。在调试模式下, ClassMapper DefinitionRepository不包含类。

我错过了什么吗?我只是不明白为什么它不起作用:/

4

1 回答 1

3

如果您在构造函数中调用它:

[Parameter] public string InlineClass { get; set; }
...
protected RazorHtmlComponent()
{
    ClassMapper = new DomDefinitionMapper(InlineClass);
}

该参数尚未设置。这将是何时OnInitialized或被OnInitializedAsync调用。
RazorHtmlComponent必须来自ComponentBase

public abstract class RazorHtmlComponent : ComponentBase, IRazorHtmlComponent
{
  [Parameter] public string InlineClass { get; set; }

  public DomDefinitionMapper ClassMapper { get; }

  ...

  protected override void OnInitialized()
  {
    ClassMapper = new DomDefinitionMapper(InlineClass);
  }
于 2020-02-17T10:52:26.973 回答