我有分页(一个Blazor组件(,它使用一个";上一个";和一个";下一个";按钮这种分页是通用形式的,当我在第一页时;上一个";按钮,并且当我在最后一页时;下一个";按钮
我目前的解决方案是这样工作的,html的构建方式并不重要:
<some html>
@code {
[Parameter]
public EventCallback OnNext { get; set; }
[Parameter]
public bool ShowNext { get; set; }
[Parameter]
public EventCallback OnPrevious { get; set; }
[Parameter]
public bool ShowPrevious { get; set; }
}
在我的html中,我将检查它是否需要显示(使用布尔值(,如果需要,它将被渲染。
与其为每个按钮提供额外的布尔参数,我更愿意这样实现:
<some html>
@code {
[Parameter]
public EventCallback OnNext { get; set; }
private bool ShowNext => OnNext.HasDelegate;
[Parameter]
public EventCallback OnPrevious { get; set; }
private bool ShowPrevious => OnPrevious.HasDelegate;
}
注意,由于Previous和Next是相同的,我只会在我的其他代码示例中使用Next
在以下两种情况中的任何一种情况下,值ShowNext都将为false;
- 您在调用中省略了OnNext参数;像这样:
<Pagination />
- 或者,由于EventCallback不能为null,您提供了默认值;像这样:
<Pagination OnNext="default(EventCallback)" />
选项1可以是锥形的,方法是在我的剃刀文件中放入if语句,呈现带有或不带有OnNext参数的分页组件。但我宁愿只制作一个分页组件,根据情况提供一个方法或默认的EventCallback;像这样:
<Pagination OnNext="@(ShowNextButton ? MyNextMethod : default(EventCallback))"
但是,这是不允许的,因为方法与EventCallback的类型不同。
现在我知道,在KISS下,您只需添加2个额外的参数(在我当前的解决方案中;请参阅第一个代码示例(;它对任何人来说都更容易理解。但这主要是因为如果可能的话,我的问题的答案并不容易。否则,有选择地定义参数的值是我经常使用的标准设计模式。
有人知道我是否可以选择提供一个方法或默认的EventCallback作为参数吗。
<Pagination OnNext="@(ShowNextButton ? MyNextMethod : default(Action))"
default(Action(与我提供的方法类型相同,它也是一个没有Delegate的EventCallback!