@onclick="(() => SomeMethod(参数))"
@onclick="(() => SomeMethod(parameter))"
我正在调查 Blazor,我无意中发现了这个表达式:
@onclick="(() => SomeMethod(parameter))"
我无法 find/google 这个(我猜是 lambda)表达式实际上在做什么。谁能解释一下这部分:() =>
以及为什么要使用它以及在哪里使用它?
编辑:
上面和这个有什么区别:
@onclick="SomeMethod(parameter)"
() =>()
基本上是一个 lambda 函数。
假设你有一个函数
delegate (int foo) { return foo*2};
这可以改写为
(int foo)=>{return foo*2};
可以缩短为
foo=>foo*2;
此处您的 onlclick
方法执行 SomeMethod
,它接收 parameter
为什么要用?
用于创建简单易用的事件处理程序、回调委托等。
引用
选项一,lambda函数(匿名函数):
@onclick="( ( ) => SomeMethod(parameter) ) "
^ ^ ^
| | |
(1) (2) (3)
当用户点击控件(1)时,函数(2)将被执行。 (3) 是函数 (2) 的主体。这是一个匿名函数,它没有名字,因为它只有括号:__no_name_function__ ( )
.
选项二,表达式:
@onclick="SomeMethod(parameter)"
^ ^
| |
(1) (2)
当用户点击控件 (1) 时,将调用表达式 (2) 的结果。这个函数应该 return 一个委托。
样本
在 blazorfiddle 尝试一下这个示例,以便更好地理解它。
<h1>@parameter</h1>
<button @onclick="@(() => SomeMethod1(parameter))" >button 1</button>
<button @onclick="SomeMethod2(parameter)" >button 2</button>
<p>@theResult</p>
@code
{
int parameter = 5;
string theResult = "";
void SomeMethod1(int p)
{
parameter++;
theResult = $"SomeMethod1 called p={p}";
}
Action SomeMethod2(int p)
{
return SomeAction;
}
void SomeAction()
{
theResult = $"Action called parameter={parameter}";
parameter++;
}
}
注意这几乎是一样的:
<button @onclick="SomeMethod2(parameter)" >button 2</button>
比这个:
<button @onclick="SomeAction" >button 2</button>
使用此模式:
<input type="button" value="Click me" @onclick="@(() => SomeMethod("my string"))" />
当您想调用方法并向其传递参数时。在后台,编译器创建了一个 EventCallback 结构,它提供了适当的委托类型,该委托类型封装了一个方法,该方法具有单个参数和 returns void
当你想调用一个没有参数的方法时使用这个模式:
<input type="button" value="Click me" @onclick="@(SomeMethod1)" />
(not recommended, embedded in a Razor expression)
或者简单地使用最常见的用法:
<input type="button" value="Click me" @onclick="@SomeMethod1" />
这也是可以的:
<input type="button" value="Click me" @onclick="SomeMethod1" />
(这里不再需要 @ 符号,但您可能会看到大多数开发人员使用它;出于习惯,因为这在过去是必需的)
希望这对您有所帮助...
我正在调查 Blazor,我无意中发现了这个表达式:
@onclick="(() => SomeMethod(parameter))"
我无法 find/google 这个(我猜是 lambda)表达式实际上在做什么。谁能解释一下这部分:() =>
以及为什么要使用它以及在哪里使用它?
编辑:
上面和这个有什么区别:
@onclick="SomeMethod(parameter)"
() =>()
基本上是一个 lambda 函数。
假设你有一个函数
delegate (int foo) { return foo*2};
这可以改写为
(int foo)=>{return foo*2};
可以缩短为
foo=>foo*2;
此处您的 onlclick
方法执行 SomeMethod
,它接收 parameter
为什么要用? 用于创建简单易用的事件处理程序、回调委托等。
引用
选项一,lambda函数(匿名函数):
@onclick="( ( ) => SomeMethod(parameter) ) "
^ ^ ^
| | |
(1) (2) (3)
当用户点击控件(1)时,函数(2)将被执行。 (3) 是函数 (2) 的主体。这是一个匿名函数,它没有名字,因为它只有括号:__no_name_function__ ( )
.
选项二,表达式:
@onclick="SomeMethod(parameter)"
^ ^
| |
(1) (2)
当用户点击控件 (1) 时,将调用表达式 (2) 的结果。这个函数应该 return 一个委托。
样本
在 blazorfiddle 尝试一下这个示例,以便更好地理解它。
<h1>@parameter</h1>
<button @onclick="@(() => SomeMethod1(parameter))" >button 1</button>
<button @onclick="SomeMethod2(parameter)" >button 2</button>
<p>@theResult</p>
@code
{
int parameter = 5;
string theResult = "";
void SomeMethod1(int p)
{
parameter++;
theResult = $"SomeMethod1 called p={p}";
}
Action SomeMethod2(int p)
{
return SomeAction;
}
void SomeAction()
{
theResult = $"Action called parameter={parameter}";
parameter++;
}
}
注意这几乎是一样的:
<button @onclick="SomeMethod2(parameter)" >button 2</button>
比这个:
<button @onclick="SomeAction" >button 2</button>
使用此模式:
<input type="button" value="Click me" @onclick="@(() => SomeMethod("my string"))" />
当您想调用方法并向其传递参数时。在后台,编译器创建了一个 EventCallback 结构,它提供了适当的委托类型,该委托类型封装了一个方法,该方法具有单个参数和 returns void
当你想调用一个没有参数的方法时使用这个模式:
<input type="button" value="Click me" @onclick="@(SomeMethod1)" />
(not recommended, embedded in a Razor expression)
或者简单地使用最常见的用法:
<input type="button" value="Click me" @onclick="@SomeMethod1" />
这也是可以的:
<input type="button" value="Click me" @onclick="SomeMethod1" />
(这里不再需要 @ 符号,但您可能会看到大多数开发人员使用它;出于习惯,因为这在过去是必需的)
希望这对您有所帮助...