假设我有一个这样的Blazor组件…
<code>@_html</code>
@code {
private string _html = "";
}
在父组件中,有如下方法…
private async Task<string> GenerateHtml() {
// Does something and returns some HTML
}
我希望父组件有一个按钮,当用户单击按钮时,GenerateHtml()
方法的返回值在子组件的Html
局部变量中设置。
这样做的原因是我将在许多地方重用子组件,每个地方都有自己的方式来生成它想要的HTML。我不想把生成代码放在子组件中,但是我不知道如何把它推进去。
我试着遵循这个答案,但无法让它工作,部分原因是它在子组件中有按钮,部分原因是生成HTML的方法将是异步的。
我也试过用EventCallback
这样做,但也不知道如何做到这一点。
总之,您希望提供一种从子组件调用父组件的GenerateHtml
方法的方法。这很容易做到。您只需要一个与Task<string> GenerateHtml()
方法签名匹配的委托类型。因为它返回一个值,所以它需要是Func<>
变量之一,因为它没有参数,所以你想要Func<Task<string>>
因此你的子组件应该指定一个该类型的参数属性:
[Parameter]
public Func<Task<string>> HtmlGenerator { get; set; }
然后在父文件中,可以使用标记:
<ChildComponent HtmlGenerator="GenerateHtml" />
从那里,子组件可以通过调用HtmlGenerator()
或HtmlGenerator?.Invoke()
来生成HTML。