ComponentBuilder 0.5.0

There is a newer version of this package available.
See the version list below for details.
dotnet add package ComponentBuilder --version 0.5.0                
NuGet\Install-Package ComponentBuilder -Version 0.5.0                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="ComponentBuilder" Version="0.5.0" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add ComponentBuilder --version 0.5.0                
#r "nuget: ComponentBuilder, 0.5.0"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install ComponentBuilder as a Cake Addin
#addin nuget:?package=ComponentBuilder&version=0.5.0

// Install ComponentBuilder as a Cake Tool
#tool nuget:?package=ComponentBuilder&version=0.5.0                

ComponentBuilder

A framework can easily help you to create blazor component.

QuickStart

1. Install package

> Install-Package ComponentBuilder

2. Add Service

service.AddComponentBuilder();

3. Define your component in behind code

[ElementTag("button")]
[CssClass("btn")]
public class Button : BlazorComponentBase, IHasChildContent
{
    [Parameter] [CssClass("btn-")] public Color? Color { get; set; }
    [Parameter] public RenderFragment ChildContent { get; set; }
}

public enum Color
{
    Primary,
    Secondary,
    Danger,
    Warning,
    Info,
    Dark,
    Light,
    Success
}

4. Use your component in razor

<Button Color="Color.Primary">Primary</Button>
<Button Color="Color.Danger">Danger</Button>

alternate text is missing from this package README image

Html display

<button class="btn btn-primary">Primary</button>
<button class="btn btn-danger">Danger</button>

Razor file VS Code behind

In Button.razor

<button class="@(GetCssClass())" @attributes="Attributes">@ChildContent</button>


@code {
    [Parameter] public RenderFragment ChildContent { get; set; }

    [Parameter(CaptureUnmatchedValues = true)] public IDictionary<string, object> Attributes { get; set; }

    [Parameter] public Color? Color { get; set; }

    [Parameter] public bool Active { get; set; }


    string GetCssClass()
    {
        var cssList = new List<string>();

        if (Active)
        {
            cssList.Add("active");
        }
        if (Color.HasValue)
        {
            cssList.Add($"btn-{Color.Value.ToString().ToLower()}");
        }
        return string.Join(" ", cssList);
    }
}

In Button.cs

[ElementTag("button")]
[CssClass("btn")]
public class Button : BlazorComponentBase, IHasChildContent
{
    [Parameter] public RenderFragment ChildContent { get; set; }

    [Parameter] [CssClass("btn-")] public Color? Color { get; set; }

    [Parameter] [CssClass("active")] public bool Active { get; set; }
}

Support

  • .NET 5
  • .NET 6

Guideline

Component definition

BlazorComponentBase

This is the base component to get all features for component, any component that contains features need to inherited from this class.

public class MyComponent : BlazorComponentBase
{
}

<MyComponent />


<div />

BlazorChildContentComponentBase

This is a base component that inherited from BlazorComponentBase and has child content parameter.

public class MyComponent : BlazorChildContentComponentBase
{
}

<MyComponent>...</MyComponent>
<MyComponent />
<MyComponent>
    <ChildContent>....</ChildContent>
</MyComponent>


<div>...</div>

or you can inplement IHasChildContent or IHasChildContent<TValue> to create child content attribute automatically.

public class MyChildContentComponent : BlazorComponentBase, IHasChildContent
{
    [Parameter]public RenderFragment ChildContent { get; set; }
}

<MyChildContentComponent>...</MyChildContentComponent>
<MyChildContentComponent />
<MyChildContentComponent>
    <ChildContent>....</ChildContent>
</MyChildContentComponent>


<div>...</div>

OR

public class MyChildModelComponent : BlazorComponentBase, IHasChildContent<MyModel>
{
    [Parameter]public RenderFragment<MyModel> ChildContent { get; set; }
}

<MyChildModelComponent>
    @context.ModelProperty 
</MyChildModelComponent>

Strong relationship for child component

Inherit BlazorParentComponentBase and BlazorChildComponentBase to create child component with strong relationship between them.

public class MyParentComponent : BlazorParentComponentBase<MyParentComponent>
{
}

public class MyChildComponent : BlazorChildComponentBase<MyParentComponent>
{
}
<MyParentComponent>
    <MyChildComponent>...</MyChildComponent>
</MyParentComponent>

OR

<MyParentComponent>
    ...
    <ChildContent>
        <MyChildComponent>...</MyChildComponent>
    </ChildContent>
    ...
</MyParentComponent>



<MyChildComponent>...</MyChildComponent>

Quick CSS apply

Define CssClassAttribute for Parameters, Class, Enum members ... and will be applied when component created.

Basic

Apply for parameters
  • Boolean type, apply value when value is true
[Parameter][CssClass("disabled")]public bool Disabled { get;set;}
<MyComponent Disabled/>

<div class="disabled"></div>
  • Int,String,Double ... those directly value types, append value behind CssClass defined
[Parameter][CssClass("margin-")]public int Margin { get; set; }

[Parameter][CssClass("padding-")]public int Padding { get; set; }
<MyComponent Margin="3" Padding="2">...</MyComponent>

<div class="margin-3 padding-2">...</div>
  • Enum type, append value for member
public enum Color
{
    Primary,
    Secondary, //apply member value with lowercase

    [CssClass("warn")]Warning   //..apply CssClass value
}

//..parameters in component
[Parameter][CssClass]public Color? Color { get; set; }
[Parameter][CssClass("bg-")]public Color? BgColor { get; set; }
<MyComponent Color="Color.Primary"/>
<div class="primary">...</div>

<MyComponent Color="Color.Warining"/>
<div class="warn">...</div>

<MyComponent Color="Color.Secondary" BgColor="Color.Primary"/>
<div class="secondary bg-primary">...</div>

Enum has default value for first member if parameter is not null

[Parameter][CssClass]public Color Color { get; set; }
<MyComponent/> 
<div class="primary">...</div>
Apply for component class

To apply default CSS class without any parameters

[CssClass("btn")]
public class Button : BlazorChildContentComponentBase
{
    [Parameter][CssClass("btn-")]public Color? Color { get; set; }
}
<Button>...</Button>
<div class="btn">...</div>

<Button Color="Color.Primary">...</Button>
<div class="btn btn-primary">...</div>
Apply for interface

Define parameters using interface to reuse same CSS class.

public interface IHasDisabled
{
    [Parameter][CssClass("disabled")]bool Disabled{ get; set; }
}

public interface IHasMarginSpace
{
    [Parameter][CssClass("margin-")]int Margin { get; set; }
}

public class MyComponent1 : BlazorComponentBase, IHasDisabled
{    
    [Parameter]public bool Disabled{ get; set; }
}

public class MyComponent2 : BlazorComponentBase, IHasDisabled, IHasMargin
{    
    [Parameter]public bool Disabled{ get; set; }
    [Parameter]public int Margin { get; set; }
}

public class MyComponent3 : BlazorComponentBase, IHasMargin
{
    //override interface pre-define value
    [Parameter][CssClass("m-")]public int Margin { get; set; }
}
<MyComponent1 Disabled />
<div class="disabled" />

<MyComponent2 Disabled Margin="3" />
<div class="disabled margin-3" />

<MyComponent3 Margin="5" />
<div class="m-5" />
Order CSS class

Set Order parameter for CssClassAttribute to order CSS class string when component built followed from small to large.

[Parameter][CssClass("block", Order=5)]public bool Block { get; set; }
[Parameter][CssClass("padding-")]public int Padding { get; set; }
<MyComponent Block Padding="3"/>
<div class="padding-3 block" />
Disabled to apply CSS class

Set Disabled to true to disable apply CSS class when parameter has value.

[Parameter][CssClass("block", Disabled=true)]public bool Block { get; set; }
<MyComponent Block />
<div>...</div>

Advance

Override BuildCssClass method

To control logical code to create CSS class

protected override void BuildCssClass(ICssClassBuilder builder)
{
    //self logical here
    if(Name is not null)
    {
        builder.Append("show active");
    }

    //enum type can invoke GetCssClass() method
    builder.Append(Color.GetCssClass(), this._hasColor)
        .Append("active")
        .Append("basic");
}

Html tag definition

Html tag name

Define HtmlTagAttribute for component to define elemen tag name. Default is div.

[HtmlTag("button")]
public class Button : BlazorComponentBase
{
}
<Button>...</Button>


<button>...</buton>

Override TagName property with logical code to output tag name.

public class MyComponent : BlazorComponentBase
{
    protected override string TagName
    {
        get 
        {
            if(Name is null)
            {
                return "a";
            }
            return "span";
        }
    }
}

Html attributes

Parameters can be html attributes when value is applied using HtmlAttribute

  • Use parameter value for attribute value
[Parameter][HtmlAttribute("href")]public string Link { get; set; }
<MyComponent Link="www.bing.com"/>
<div href="www.bing.com"/>
  • Use bool value of parameter for fixed attribute value when true
[Parameter][HtmlAttribute("data-toggle", "toggle")]public bool Toggle{ get; set; }
<MyComponent Block />
<div data-toggle="toggle" />
  • Use parameter name to be attribute's name
[Parameter][HtmlAttribute]public string Id { get; set; }
<MyComponent Id="id-node" />
<div id="id-node" />
  • Pre-define html attribute for component
[HtmlAttribute("role","alert")]
public class MyComponent : BlazorComponentBase
{
}

OR

use HtmlRoleAttribute to instead HtmlAttribute("role", value)

[HtmlRole("alert")]
public class MyComponent : BlazorComponentBase
{
}
<MyComponent />

<div role="alert" />

Parameter pre-definition

Parameter pre-definition always named starts with IHasXXX for specification.

IHasChildContent

Contains parameter ChildContent in IHasChildContent or ChildContent<TValue> in IHasChildContent<TValue>

Product Compatible and additional computed target framework versions.
.NET net5.0 is compatible.  net5.0-windows was computed.  net6.0 is compatible.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (5)

Showing the top 5 NuGet packages that depend on ComponentBuilder:

Package Downloads
TDesign

基于腾讯 TDesign 的 Blazor 企业级组件库。腾讯 TDesign 官方地址:https://tdesign.tencent.com/

BlamanticUI

The css framework from Semantic-UI for blazor without jQuery.

ComponentBuilder.FluentRenderTree

用链式编程的方式简化 RenderTreeBuilder 的操作。 示例: builder.Element("div").Content("hello").Close(); builder.Component<Button>().Content("Button").Close(); builder.Div(Id is not null).Content(content => content.Component<Icon>().Attribute(m => m.Name, "user").Close()).Close();

ComponentBuilder.Interceptors.Diagnostics.Console

在控制台中用于组件生命周期诊断的拦截器,该拦截器可以用于调试阶段的生命周期运行的输出。

ComponentBuilder.Resolvers.FluentClass

组件参数支持 IFluentClassProvider 自动解析成 CSS 类。 [Parameter]public IFluentClassProvider Parameter{ get; set; } <Component Parameter="Provider.Is3.FromTop.HasSmall" />

GitHub repositories (1)

Showing the top 1 popular GitHub repositories that depend on ComponentBuilder:

Repository Stars
tdesign-blazor/TDesignBlazor
基于腾讯 TDesign 的 Blazor 组件库
Version Downloads Last updated
5.1.0 135 3/7/2024
5.0.0 190 12/21/2023
5.0.0-beta-1 157 11/16/2023
4.1.2 1,015 7/17/2023
4.1.1 204 7/17/2023
4.1.0 747 6/4/2023
4.0.0 483 5/30/2023
4.0.0-beta-3 259 5/22/2023
4.0.0-beta-2 140 5/19/2023
4.0.0-beta-1 145 5/17/2023
3.1.4 533 3/17/2023
3.1.3 200 3/16/2023
3.1.0 217 3/10/2023
3.0.0 741 2/24/2023
3.0.0-beta-0217 102 2/16/2023
3.0.0-beta-0206 185 2/6/2023
3.0.0-beta-0130 112 1/30/2023
3.0.0-beta-0114 119 1/13/2023
2.3.0 301 12/28/2022
2.2.0 297 12/13/2022
2.1.0 1,456 11/24/2022
2.0.0 367 10/28/2022
1.5.0.4 379 10/18/2022
1.5.0.3 397 10/13/2022
1.5.0.2 1,225 10/5/2022
1.5.0.1 399 10/3/2022
1.5.0 406 10/1/2022
1.4.1.1 672 9/19/2022
1.4.1 410 9/16/2022
1.4.0 424 9/15/2022
1.3.0 419 8/29/2022
1.2.1 581 7/12/2022
1.2.0 417 7/11/2022
1.1.0 561 5/22/2022
1.0.0 616 3/23/2022
0.7.0 444 3/11/2022
0.6.0 442 2/9/2022
0.5.0 276 1/6/2022
0.4.0 286 12/23/2021
0.3.0 299 12/16/2021
0.2.0 306 12/7/2021
0.1.0 6,152 11/24/2021