Вы можете попробовать обернуть оба компонента во внешний компонент, а затем использовать внешний как контейнер состояния.
Контейнер
<div>
<ComponentA @ref="_componentA" ListItems="ListA"/>
<ComponentB @ref="_componentb" ListItems="ListB"/>
</div>
@code {
Public List<T> ListA { get; set; }
Public List<T> ListB => ListA.Where(x => x.IsSelected).ToList();
ComponentA _componentA;
ComponentB _componentB;
}
Теперь ваши списки отделены от деталей рендеринга, а ListB просто выводится из ListA и дает вам список, отфильтрованный по логическим значениям нужно будет настроить. В целях сохранения проблем в нужных местах все функции списка (списков) также должны находиться в компоненте контейнера. У вас также есть ссылки на 2 компонента, настроенных так, что вы можете использовать их методы publi c извне.
Чтобы получить доступ к компонентам, установите для них свойство IsVisible, начальное значение, методы для отображения и скрытия и свойство EventCallBack
, чтобы вызывающий код мог устанавливать методы. Вам также понадобится элемент управления (кнопка?) Для обратного вызова.
Компонент A
<div style="display: @(IsVisible ? "flex" : "none")">
@foreach (var item in Items)
{
//Do something awesome
}
<button @onclick="@(() => ToggleToB.InvokeAsync())">Toggle to Component B</button>
</div>
@code {
[Parameter]
public List<T> Items { get; set; }
[Parameter]
public EventCallBack ToggleToB { get; set; }
private bool IsVisible { get; set } = true
public void Show()
{
IsVisible = true;
}
public void Hide()
{
IsVisible = false;
}
... other component details
}
Компонент B будет иметь ту же настройку, но начальное значение IsVisible будет false
, так как вы не хотите видеть это изначально.
Теперь вы можете настроить методы из Container
, которые воздействуют на методы компонента, поэтому ваш контейнер будет выглядеть ниже. Обратите внимание на методы обратного вызова в тегах <Component>
:
Контейнер обновлено
<div>
<ComponentA @ref="_componentA" ListItems="ListA" ToggleToB="@ShowComponentB"/>
<ComponentB @ref="_componentb" ListItems="ListB" ToggleToA="@ShowComponentA"/>
</div>
@code {
Public List<T> ListA { get; set; }
Public List<T> ListB => ListA.Where(x => x.IsSelected).ToList();
public ComponentA _componentA;
ComponentB _componentB;
public void ShowComponentA()
{
_componentA.Show();
_componentB.Hide();
}
public void ShowComponentB()
{
_componentB.Show();
_componentA.Hide();
}
public void ListBConfirmed()
{
// Do whatever you do once you go through Component B
ShowComponentA();
}
}
Наконец, помните, что ни компоненту A, ни B не нужны @page
в списке, вместо этого сделайте это в Container
для вашей маршрутизации, поскольку каждый компонент в контейнере теперь предназначен для упаковки в контейнер для захвата ссылки и получения ее списка.
И все, теперь у вас есть Компоненты A и B для визуализации списков из другого источника, и вся сантехника, необходимая для обработки методов из внешнего источника для обновления списков по мере необходимости. Просто добавьте больше EventCallBack
параметров по мере необходимости, и если у вас есть параметры для передачи в методы контейнера, не забудьте использовать EventCallBack<T>
.