@onclick = "(() => SomeMethod (параметр))" - PullRequest
0 голосов
/ 29 октября 2019

Я смотрю в Blazor и наткнулся на это выражение:

 @onclick="(() => SomeMethod(parameter))"

Я нигде не могу найти / google, что на самом деле делает это (я думаю, лямбда) выражение. Кто-нибудь может объяснить мне, пожалуйста, эту часть: () => и зачем ее использовать и где?

РЕДАКТИРОВАТЬ:

В чем разница между выше и этим:

 @onclick="SomeMethod(parameter)"

Ответы [ 3 ]

2 голосов
/ 29 октября 2019

() =>() в основном лямбда-функция.

Представьте, что у вас есть функция

delegate (int foo) { return foo*2};

, которую можно переписать как

(int foo)=>{return foo*2};

, которую можно сократить до

 foo=>foo*2;

Здесь вашonlclick метод выполняет SomeMethod, который принимает parameter

Зачем использовать? Для создания простых и удобных обработчиков событий, делегатов колбэков и т. Д.

Ссылка

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/statements-expressions-operators/lambda-expressions

1 голос
/ 29 октября 2019

Вариант 1, лямбда-функция (анонимная функция):

    @onclick="( ( ) => SomeMethod(parameter) ) "
       ^         ^     ^
       |         |     |
       (1)       (2)   (3)

Когда пользователь нажимает на элемент управления (1), функция (2) будет выполняться. (3) является телом функции (2). Это анонимная функция, у нее нет имени, потому что она содержит только круглые скобки: __no_name_function__ ( ).

Вариант второй, выражение:

    @onclick="SomeMethod(parameter)"
       ^             ^
       |             |
       (1)           (2)

Когда пользователь нажимает на элемент управления (1),результат выражения (2) будет вызван. Эта функция должна возвращать делегата.

Пример

Поиграйте с этим примером на 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>
0 голосов
/ 29 октября 2019

Используйте этот шаблон:

<input type="button" value="Click me" @onclick="@(() => SomeMethod("my string"))" />

, если вы хотите вызвать метод и передать ему параметр. За кулисами компилятор создает структуру EventCallback, которая предоставляет соответствующий тип делегата, который инкапсулирует метод с единственным параметром и возвращает 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" />

(знак @ здесь больше не нужно, но вы можете видеть, что большинство разработчиков используют его, хотя и по привычке, как это было необходимо в старые времена)

надеюсь, это поможет ...

...