我正在尝试构建一个组件,该组件获取对象列表并在单击组件中的 html 按钮时执行在对象内部定义的操作。这里的代码实际上可以工作,但会发出警告。
Warning BL0005: Component parameter 'ClickAction' should not be set outside of its component. (18, 17)
我在网上阅读了有关该问题的信息,我认为可以使用 EventCallback 而不是 Action 来解决此问题。但我不确定如何为给定的代码执行此操作。 我不确定这是否是最好的方法。它应该像 Foo 方法一样为 void 工作,像 Foo2 中的异步一样工作。
任何帮助都会很棒。
我的索引文件:
@page "/"
<div>
<ActionButtonBar ActionButtons="Actbtns"></ActionButtonBar>
</div>
@code {
List<ActionButton> Actbtns = new();
protected override Task OnInitializedAsync()
{
var somebtns = new List<ActionButton>
{
new()
{
Title = "Action 1",
ClickAction = Foo
},
new()
{
Title = "Action 2",
ClickAction = async () => await Foo2()
}
};
Actbtns.AddRange(somebtns);
return base.OnInitializedAsync();
}
public void Foo() {}
public async Task Foo2() {await Task.CompletedTask;}
}
ActionButtonBar 组件
<div id="button-group-container" class="btn-group" role="group" aria-label="Basic example">
@foreach (var button in ActionButtons)
{
<button type="button" class="btn btn-info rounded-pill" onclick="@button.ClickAction">@button.Title</button>
}
</div>
@code {
[Parameter]
public List<ActionButton> ActionButtons { get; set; } = new();
}
动作按钮
public class ActionButton : ComponentBase
{
public string Title { get; set; } = string.Empty;
[Parameter]
public Action? ClickAction {get; set;}
}
根据你的例子,
ActionButton
是一个单独的类,它不是一个组件,所以你不需要给它添加[Parameter]
属性:
public class ActionButton : ComponentBase
{
public string Title { get; set; } = string.Empty;
//[Parameter]
public Action? ClickAction { get; set; }
}
如果
[Parameter]
属性是必需的并且您的值不会更改,则可以忽略这些警告:
protected override Task OnInitializedAsync()
{
//#pragma warning disable BL0005
//...
//#pragma warning restore BL0005
}
请注意,这并不能保证在渲染树中添加或删除组件不会产生副作用。