Запретить перезагрузку дочернего компонента после изменения состояния?

#c# #blazor #blazor-server-side

#c# #blazor #blazor-на стороне сервера

Вопрос:

У меня есть компонент с разными компонентами внутри, которые имеют разные параметры, заданные родительским компонентом. В одном компоненте есть, например, логическое значение. Он получает значение (true) в качестве параметра от родительского компонента. Если я изменяю логическое значение внутри дочернего компонента (на false), а затем в родительском компоненте происходит что-то, вызывающее изменение состояния, дочерний компонент обновляется с помощью параметра bool из родительского компонента (true).

Есть ли какой-нибудь классный способ предотвратить это, чтобы bool сохранял свое значение? Или я должен делать что-то вроде обратного вызова, чтобы bool внутри родительского изменялся каждый раз, когда изменяется bool внутри дочернего элемента? И если мне нужно это сделать, правильно ли это, или есть более простой способ?

 Parent

<TestComponent boolChanged="this.ChangeBool" MyBool="this.myBool"></TestComponent>

@code {
    private bool myBool = true;

private void ChangeBool(bool change)
{
    this.myBool = change;
}
}


Child

@code {
    [Parameter]
    public bool MyBool { get; set; }

[Parameter]
public EventCallback<bool> boolChanged { get; set; }

private async Task SetBoolFalse()
{
    this.MyBool = false;
    await this.boolChanged.InvokeAsync(this.MyBool);
}
}
 

Похоже, много работы, если есть несколько параметров.

Комментарии:

1. Дочерний компонент не должен устанавливать этот параметр, в вашем дизайне что-то не так. Рассмотрите возможность использования другого var для хранения внутреннего состояния.

Ответ №1:

Дочерний компонент (TestComponent)

 @code {
    private bool myBool; 
    [Parameter]
    public bool MyBool { get; set; }

    [Parameter]
    public EventCallback<bool> MyBoolChanged { get; set; }

    protected override void OnParametersSet()
    {
        myBool = MyBool;
    }

   private async Task SetBoolFalse()
   {
      myBool = false;
      await MyBoolChanged.InvokeAsync(myBool);
   }
}
 

Родительский компонент

 <div>@myBool.ToString()</div>

<TestComponent @bind-Value="myBool"/>

@code {
    private bool myBool = true;
}
 

Примечание: вы никогда не должны изменять состояние параметров. Свойства параметров используются только для передачи данных между компонентами. Вы должны определить локальную переменную (myBool) для поддержания вашего состояния. Обратите внимание, что я инициализирую переменную myBool значением свойства параметра MyBool в методе жизненного цикла OnParametersSet .

Комментарии:

1. Спасибо. Есть ли способ сделать это с более чем одним параметром, когда я использую @bind-Value, как вы?

2. Не уверен, что я вас понимаю, но если вы имеете в виду, что хотите отправить дочернему компоненту два параметра, первый из которых имеет строковый тип, а второй — тип int, тогда вы можете определить класс с соответствующими параметрами и привязать его к своему компоненту.

3. Да, именно так и было задумано. Мне очень помогло, спасибо.

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

5. Небольшая ошибка в вашем коде: это должно быть @bind-MyBool=»myBool» вместо @bind-Value=»myBool»