Blazor 传递和来自子组件的 运行 任务 - 无法从 'method group' 转换为 'Task<int>'
Blazor pass and run Task from child component - cannot convert from 'method group' to 'Task<int>'
在我的父组件中,我有一个任务,我想将其传递给子组件。
父组件:
<ChildComponent ChangePageMethod="@ChangePage" />
@code {
public async Task ChangePage(int page)
{
Console.WriteLine(page);
}
}
子组件:
<a @onclick="prevPage">Prev</a>
<a @onclick="nextPage">Next</a>
@code {
[Parameter]
public int Page { get; set; } = 3;
[Parameter]
public Task ChangePageMethod { get; set; }
private void prevPage()
{
}
private void _nextPage()
{
}
}
目前我收到此错误:无法从 'method group' 转换为 'Task'
有什么解决方法吗?以及如何 运行 从父级传递参数的任务?
该错误为您提供了您正在尝试执行的操作的准确解释。您正在尝试将方法设置为 Task
属性。 Task
不是你的方法,Task
是你的方法returns。所以如果你想存储这个方法,使用像 Func<int, Task>
.
这样的类型
对于运行存储在这个属性中的方法,你应该在你要调用它的方法中添加async
修饰符,例如private async void prevPage()
, 并在其正文中使用 await ChangePageMethod(Page);
.
此外,我建议您闲暇时阅读有关 async/await 和任务的文章。
这种情况的经典模式是 ChildComponent
中的以下代码
<a @onclick="(e) => prevPage()">Prev</a>
<a @onclick="(e) => nextPage()">Next</a>
使用 Lambda 表达式将鼠标事件接收为 e
,然后调用您的方法。
[Parameter]
public EventCallback<int> ChangePageMethod { get; set; }
private void nextPage()
{
// increment the page and call the Event CallBack
Page++;
ChangePageMethod.InvokeAsync(Page);
}
nextPage
递增页面计数器,然后调用回调事件。您不需要在此处使用任务。触发此事件的鼠标单击事件是即发即弃。
在 ParentComponent
中,回调 ChangePageMethod
现在传递页码,因此 ChangePage
将正确处理它。
public void ChangePage(int page)
{
Console.WriteLine(page);
}
ChangePage
是事件处理器所以一般情况下你return一个void。如果它包含任何异步代码,您会将其标记为异步。请参阅下面我们使用异步 Task.Delay()
模拟屈服 Task
.
的地方
public async void ChangePage(int page)
{
await Task.Delay(10);
Console.WriteLine(page);
}
ChangePage
只需要声明为 return a Task
如果您在 nextPage
或 prevPage
中有低于 InvokeAsync
的代码在执行之前需要等待你在 ChangePage
中所做的任何事情。
下面 ChangePage 的两个示例模式:
public async Task ChangePage(int page)
{
Console.WriteLine(page);
return Task.Delay(10);
}
public Task ChangePage(int page)
{
Console.WriteLine(page);
return Task.Completed;
}
上一页的示例模式
private async void prevPage()
{
// decrement the page and call the Event CallBack
Page--;
await ChangePageMethod.InvokeAsync(Page);
// Dependant code here
}
PS - 我认为我的所有代码都是正确的,但我还没有测试代码,所以可能会有一两个错字。检查 MS 文档 here 中的数据绑定。
在我的父组件中,我有一个任务,我想将其传递给子组件。
父组件:
<ChildComponent ChangePageMethod="@ChangePage" />
@code {
public async Task ChangePage(int page)
{
Console.WriteLine(page);
}
}
子组件:
<a @onclick="prevPage">Prev</a>
<a @onclick="nextPage">Next</a>
@code {
[Parameter]
public int Page { get; set; } = 3;
[Parameter]
public Task ChangePageMethod { get; set; }
private void prevPage()
{
}
private void _nextPage()
{
}
}
目前我收到此错误:无法从 'method group' 转换为 'Task'
有什么解决方法吗?以及如何 运行 从父级传递参数的任务?
该错误为您提供了您正在尝试执行的操作的准确解释。您正在尝试将方法设置为 Task
属性。 Task
不是你的方法,Task
是你的方法returns。所以如果你想存储这个方法,使用像 Func<int, Task>
.
对于运行存储在这个属性中的方法,你应该在你要调用它的方法中添加async
修饰符,例如private async void prevPage()
, 并在其正文中使用 await ChangePageMethod(Page);
.
此外,我建议您闲暇时阅读有关 async/await 和任务的文章。
这种情况的经典模式是 ChildComponent
<a @onclick="(e) => prevPage()">Prev</a>
<a @onclick="(e) => nextPage()">Next</a>
使用 Lambda 表达式将鼠标事件接收为 e
,然后调用您的方法。
[Parameter]
public EventCallback<int> ChangePageMethod { get; set; }
private void nextPage()
{
// increment the page and call the Event CallBack
Page++;
ChangePageMethod.InvokeAsync(Page);
}
nextPage
递增页面计数器,然后调用回调事件。您不需要在此处使用任务。触发此事件的鼠标单击事件是即发即弃。
在 ParentComponent
中,回调 ChangePageMethod
现在传递页码,因此 ChangePage
将正确处理它。
public void ChangePage(int page)
{
Console.WriteLine(page);
}
ChangePage
是事件处理器所以一般情况下你return一个void。如果它包含任何异步代码,您会将其标记为异步。请参阅下面我们使用异步 Task.Delay()
模拟屈服 Task
.
public async void ChangePage(int page)
{
await Task.Delay(10);
Console.WriteLine(page);
}
ChangePage
只需要声明为 return a Task
如果您在 nextPage
或 prevPage
中有低于 InvokeAsync
的代码在执行之前需要等待你在 ChangePage
中所做的任何事情。
下面 ChangePage 的两个示例模式:
public async Task ChangePage(int page)
{
Console.WriteLine(page);
return Task.Delay(10);
}
public Task ChangePage(int page)
{
Console.WriteLine(page);
return Task.Completed;
}
上一页的示例模式
private async void prevPage()
{
// decrement the page and call the Event CallBack
Page--;
await ChangePageMethod.InvokeAsync(Page);
// Dependant code here
}
PS - 我认为我的所有代码都是正确的,但我还没有测试代码,所以可能会有一两个错字。检查 MS 文档 here 中的数据绑定。