Skip to content

Commit f1d3146

Browse files
authored
feat(DynamicElement): add Key parameter (#7636)
* feat: 增加 Key 参数 * refactor: 使用回调方法 GetKeyByITem 获得行 Key 值 * chore: bump version 9.6.5 * feat: 增加 PdfOptions 配置项 * chore: bump version 9.6.6 * refactor: 调整 IconTemplate 优先级别 * feat: 增加 ActionButtonTemplate 模板 * refactor: 增加条件 * chore: bump version 9.6.7 * feat(IpAddress): support paste function (#7276) * feat(IpAddress): support paste function * refactor: 代码格式化 # Conflicts: # src/BootstrapBlazor/Components/IpAddress/IpAddress.razor.js * chore: bump version 9.6.8 * feat(IpAddress): trigger ValueChanged on paste event (#7280) * refactor: 增加 JSInvoke 能力 * refactor: 更改样式 * refactor: 增加客户端更改 IP 回调方法 * test: 更新单元测试 * chore: bump version 10.1.3 # Conflicts: # src/BootstrapBlazor/BootstrapBlazor.csproj # src/BootstrapBlazor/Components/IpAddress/IpAddress.razor.scss # test/UnitTest/Components/IpAddressTest.cs * chore: bump version 9.6.9 * chore: 支持 Interop 参数 * chore: bump version 9.6.10 * feat: 增加 OnBeforeTreeItemClick 方法 * chore: bump version 9.6.11 * refactor: 兼容嵌套问题 * chore: bump version 9.6.12 * feat: 支持端口 * chore: bump version 9.6-13-beta01 * chore: bump version 9.6.13 * feat(ZipArchiveService): add ArchiveDirectoryAsync method # Conflicts: # src/BootstrapBlazor/Services/DefaultZipArchiveService.cs # src/BootstrapBlazor/Services/IZipArchiveService.cs * test: 增加单元测试 # Conflicts: # test/UnitTest/Services/ZipArchiveServiceTest.cs * chore: bump version 9.6.14 * refactor: 增加 Key 参数 * refactor: 取消冗余代码 * revert: 撤销更改 * refactor: 移动 SetKey 位置 * refactor: 调整序号 * test: 增加单元测试
1 parent 13ee4a9 commit f1d3146

File tree

3 files changed

+55
-25
lines changed

3 files changed

+55
-25
lines changed

src/BootstrapBlazor/Components/BaseComponents/DynamicElement.cs

Lines changed: 33 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -10,98 +10,109 @@ namespace BootstrapBlazor.Components;
1010

1111
/// <summary>
1212
/// <para lang="zh">动态元素组件</para>
13-
/// <para lang="en">动态元素component</para>
13+
/// <para lang="en">Dynamic element component</para>
1414
/// </summary>
1515
public class DynamicElement : BootstrapComponentBase
1616
{
1717
/// <summary>
1818
/// <para lang="zh">获得/设置 TagName 属性 默认为 div</para>
19-
/// <para lang="en">Gets or sets TagName property Default is为 div</para>
19+
/// <para lang="en">Gets or sets the TagName property. Default is div</para>
2020
/// </summary>
2121
[Parameter]
2222
[NotNull]
2323
public string? TagName { get; set; } = "div";
2424

2525
/// <summary>
2626
/// <para lang="zh">获得/设置 是否触发 Click 事件 默认 true</para>
27-
/// <para lang="en">Gets or sets whether触发 Click 事件 Default is true</para>
27+
/// <para lang="en">Gets or sets whether to trigger Click event. Default is true</para>
2828
/// </summary>
2929
[Parameter]
3030
public bool TriggerClick { get; set; } = true;
3131

3232
/// <summary>
3333
/// <para lang="zh">获得/设置 是否阻止默认行为 默认 false</para>
34-
/// <para lang="en">Gets or sets whether阻止Default is行为 Default is false</para>
34+
/// <para lang="en">Gets or sets whether to prevent default behavior. Default is false</para>
3535
/// </summary>
3636
[Parameter]
3737
public bool PreventDefault { get; set; }
3838

3939
/// <summary>
4040
/// <para lang="zh">获得/设置 是否事件冒泡 默认为 false</para>
41-
/// <para lang="en">Gets or sets whether事件冒泡 Default is为 false</para>
41+
/// <para lang="en">Gets or sets whether to stop event propagation. Default is false</para>
4242
/// </summary>
4343
[Parameter]
4444
public bool StopPropagation { get; set; }
4545

4646
/// <summary>
4747
/// <para lang="zh">获得/设置 Click 回调委托</para>
48-
/// <para lang="en">Gets or sets Click 回调delegate</para>
48+
/// <para lang="en">Gets or sets the Click callback delegate</para>
4949
/// </summary>
5050
[Parameter]
5151
public Func<Task>? OnClick { get; set; }
5252

5353
/// <summary>
5454
/// <para lang="zh">获得/设置 是否触发 DoubleClick 事件 默认 true</para>
55-
/// <para lang="en">Gets or sets whether触发 DoubleClick 事件 Default is true</para>
55+
/// <para lang="en">Gets or sets whether to trigger DoubleClick event. Default is true</para>
5656
/// </summary>
5757
[Parameter]
5858
public bool TriggerDoubleClick { get; set; } = true;
5959

6060
/// <summary>
6161
/// <para lang="zh">获得/设置 DoubleClick 回调委托</para>
62-
/// <para lang="en">Gets or sets DoubleClick 回调delegate</para>
62+
/// <para lang="en">Gets or sets the DoubleClick callback delegate</para>
6363
/// </summary>
6464
[Parameter]
6565
public Func<Task>? OnDoubleClick { get; set; }
6666

6767
/// <summary>
6868
/// <para lang="zh">获得/设置 OnContextMenu 回调委托</para>
69-
/// <para lang="en">Gets or sets OnContextMenu 回调delegate</para>
69+
/// <para lang="en">Gets or sets the OnContextMenu callback delegate</para>
7070
/// </summary>
7171
[Parameter]
7272
public Func<MouseEventArgs, Task>? OnContextMenu { get; set; }
7373

7474
/// <summary>
7575
/// <para lang="zh">获得/设置 是否触发 OnContextMenu 事件 默认 false</para>
76-
/// <para lang="en">Gets or sets whether触发 OnContextMenu 事件 Default is false</para>
76+
/// <para lang="en">Gets or sets whether to trigger OnContextMenu event. Default is false</para>
7777
/// </summary>
7878
[Parameter]
7979
public bool TriggerContextMenu { get; set; }
8080

8181
/// <summary>
8282
/// <para lang="zh">获得/设置 内容组件</para>
83-
/// <para lang="en">Gets or sets contentcomponent</para>
83+
/// <para lang="en">Gets or sets the child content</para>
8484
/// </summary>
8585
[Parameter]
8686
public RenderFragment? ChildContent { get; set; }
8787

8888
/// <summary>
8989
/// <para lang="zh">获得/设置 是否生成指定 Tag 元素 默认 true 生成</para>
90-
/// <para lang="en">Gets or sets whether生成指定 Tag 元素 Default is true 生成</para>
90+
/// <para lang="en">Gets or sets whether to generate the specified Tag element. Default is true</para>
9191
/// </summary>
9292
[Parameter]
9393
public bool GenerateElement { get; set; } = true;
9494

9595
/// <summary>
96-
/// <para lang="zh">BuildRenderTree 方法</para>
97-
/// <para lang="en">BuildRenderTree 方法</para>
96+
/// <para lang="zh">获得/设置 元素唯一标识 Key 默认 null</para>
97+
/// <para lang="en">Gets or sets the unique key of the element. Default null</para>
98+
/// </summary>
99+
[Parameter]
100+
public object? Key { get; set; }
101+
102+
/// <summary>
103+
/// <inheritdoc/>
98104
/// </summary>
99105
/// <param name="builder"></param>
100106
protected override void BuildRenderTree(RenderTreeBuilder builder)
101107
{
102108
if (GenerateElement || IsTriggerClick() || IsTriggerDoubleClick())
103109
{
104110
builder.OpenElement(0, TagName);
111+
112+
if (Key != null)
113+
{
114+
builder.SetKey(Key);
115+
}
105116
if (AdditionalAttributes != null)
106117
{
107118
builder.AddMultipleAttributes(1, AdditionalAttributes);
@@ -111,26 +122,24 @@ protected override void BuildRenderTree(RenderTreeBuilder builder)
111122
if (IsTriggerClick())
112123
{
113124
builder.AddAttribute(2, "onclick", EventCallback.Factory.Create<MouseEventArgs>(this, OnTriggerClick));
125+
builder.AddEventPreventDefaultAttribute(3, "onclick", PreventDefault);
126+
builder.AddEventStopPropagationAttribute(4, "onclick", StopPropagation);
114127
}
115128

116129
if (IsTriggerDoubleClick())
117130
{
118-
builder.AddAttribute(3, "ondblclick", EventCallback.Factory.Create<MouseEventArgs>(this, OnTriggerDoubleClick));
119-
}
120-
121-
if (IsTriggerClick() || IsTriggerDoubleClick())
122-
{
123-
builder.AddEventPreventDefaultAttribute(4, "onclick", PreventDefault);
124-
builder.AddEventStopPropagationAttribute(5, "onclick", StopPropagation);
131+
builder.AddAttribute(5, "ondblclick", EventCallback.Factory.Create<MouseEventArgs>(this, OnTriggerDoubleClick));
132+
builder.AddEventPreventDefaultAttribute(6, "ondblclick", PreventDefault);
133+
builder.AddEventStopPropagationAttribute(7, "ondblclick", StopPropagation);
125134
}
126135

127136
if (IsTriggerContextMenu())
128137
{
129-
builder.AddAttribute(6, "oncontextmenu", EventCallback.Factory.Create<MouseEventArgs>(this, OnTriggerContextMenu));
130-
builder.AddEventPreventDefaultAttribute(7, "oncontextmenu", true);
138+
builder.AddAttribute(8, "oncontextmenu", EventCallback.Factory.Create<MouseEventArgs>(this, OnTriggerContextMenu));
139+
builder.AddEventPreventDefaultAttribute(9, "oncontextmenu", true);
131140
}
132141

133-
builder.AddContent(8, ChildContent);
142+
builder.AddContent(10, ChildContent);
134143

135144
if (GenerateElement || IsTriggerClick() || IsTriggerDoubleClick())
136145
{
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the Apache 2.0 License
3+
// See the LICENSE file in the project root for more information.
4+
// Maintainer: Argo Zhang(argo@live.ca) Website: https://www.blazor.zone
5+
6+
namespace UnitTest.Components;
7+
8+
public class DynamicElementTest
9+
{
10+
[Fact]
11+
public void Key_OK()
12+
{
13+
var context = new BunitContext();
14+
var cut = context.Render<DynamicElement>(pb =>
15+
{
16+
pb.Add(s => s.Key, Guid.NewGuid());
17+
});
18+
19+
Assert.Equal("<div></div>", cut.Markup);
20+
}
21+
}

test/UnitTest/Core/TestBase.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public void Dispose()
2222
#pragma warning disable CA2012
2323
// 由于 bUnit 2.0 继承了 IAsyncDisposable 接口,因此此处调用 DisposeAsync 方法
2424
Context.DisposeAsync();
25-
#pragma warning restore CA2012
25+
#pragma warning restore CA2012
2626
GC.SuppressFinalize(this);
2727
}
2828
}

0 commit comments

Comments
 (0)