Параметры отправляются снова после запуска / вызова EventCallback - PullRequest
0 голосов
/ 28 марта 2020

При использовании EventCallback в моем компоненте параметры для элемента управления отправляются снова / не обновляются корректно.

Компонент

<button @onclick="@(e => ChangePlaceholder())">Change Placeholder</button>
<button @onclick="@(e => ChangePlaceholderEvent())">Change Placeholder Event</button>
<label>@Placeholder</label>

@code {
    [Parameter]
    public string Placeholder { get; set; }

    [Parameter]
    public EventCallback<string> OnChanged { get; set; }

    private void ChangePlaceholder()
    {
        Placeholder = "hello";
    }

    private void ChangePlaceholderEvent()
    {
        Placeholder = "hello";

        OnSelectedChanged.InvokeAsync(Placeholder);
    }
}

Родительская страница

<Control Placeholder="something" OnChanged=@UpdateSomething />

@code {    
    static void UpdateSomething(string someString)
    {
        Console.WriteLine($"Event went kablam: {someString}");
    }
}

Если вы должны были запустить функцию ChangePlaceholder () , тогда пользовательский интерфейс обновит и изменится, скажем, 'hello' , но если вы запустите функцию ChangePlaceholderEvent () , метка возвращается к 'что-то' , которое является строкой, в которой параметр Placeholder отправляется в первую очередь.

Это заставляет меня поверить, что запуск EventCallback также делает другие параметры для элемент управления для повторной отправки.

Как остановить повторную отправку параметров?

Редактировать: я создал приложение webassemby и протестировал тот же код, и возникает та же ошибка.

1 Ответ

1 голос
/ 14 апреля 2020

Обратные вызовы событий вызовут повторную визуализацию родительского компонента, и вы безоговорочно передаете «что-то», что вызывает повторную визуализацию «чего-то».

Проблема здесь является то, что вы используете параметр в качестве состояния для вашего компонента, которого вы должны избегать.

Ссылка

Вы можете обойти вашу проблему, используя 'Action вместо EventCallback:

[Parameter]
public Action<string> OnChanged { get; set; }

@code {
    private void ChangePlaceholderEvent()
    {
        Placeholder = "hello";

        OnChanged(Placeholder);
    }
}
...