#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»