【问题标题】:Blazor - how to remove a child componentBlazor - 如何删除子组件
【发布时间】:2021-08-18 08:42:21
【问题描述】:

背景

我有一个带有多个按钮的组件 MainComponent,这将使新的 SubComponent 出现 (<TaskList AreaId="@SelectedAreaId" IsVisible="@IsVisible"></TaskList>)。

问题

当我想在SubComponent 上放置一个关闭按钮时出现问题:我尝试在其上创建一个按钮并制作:IsVisible = !IsVisible。虽然这在某种程度上确实有效(它使组件从视图中消失),但它的问题是,如果我从 MainComponent 使用相同的 SubComponent 单击按钮,它将不会出现(我假设因为组件是仍然“活着”)。

解决这个问题的最佳方法是什么?我正在考虑在SubComponent 上使用IDisposable,但未定义ComponentName.Dispose()

Edit1:添加了我当前正在做的示例

MainComponent (TaskList.razor)

    <div class="col-12 outer-div row">
        <TaskDetails TaskId="@SelectedTaskId" IsVisible="@IsTaskDetailsVisible"></TaskDetails>
    </div>
    ...
            <ul>
                @for (int i = 0; i < MondayTasks.Count(); i++)
                {
                    var myIndex = i;
                    <li class="btn" @onclick="@(() => LoadTaskDetailsForTask(MondayTasks[myIndex].Id))">
                        <a role="button">
                            <h4>@MondayTasks[i].Name</h4>
                            <p>@MondayTasks[i].DeadlineDate.Date.ToShortDateString()</p>
                        </a>
                    </li>
                }
            </ul>
    ...

private async Task LoadTaskDetailsForTask(int taskId)
{
    SelectedTaskId = taskId;
    IsTaskDetailsVisible = true;
    await JSRuntime.InvokeVoidAsync("onScrollEvent");
}

子组件(TaskDetails.razor)

@if (IsVisible)
{
    ...
            <div class="row">
                <h2 class="inner-div title">@taskDetails.Name</h2>
                <span class="closebtn" @onclick="()=> ToggleVisibility()">&times;</span>
            </div>

    //Display Information
}

...
protected async override void OnParametersSet()
{
    taskDetails = await _dbTasks.GetTasksDetails(TaskId);
    TaskItems = await _dbTasks.GetTasksItems(TaskId);
    this.StateHasChanged();
}

private void ToggleVisibility()
{
    IsVisible = !IsVisible;
}

Edit2:添加了工作代码

MainComponent (TaskList.razor)

    <CascadingValue Value="this">
    <div class="col-12 outer-div row">
        <TaskDetails TaskId="@SelectedTaskId" IsVisible="@IsTaskDetailsVisible"></TaskDetails>
    </div>
    </CascadingValue>
    ...
            <ul>
                @for (int i = 0; i < MondayTasks.Count(); i++)
                {
                    var myIndex = i;
                    <li class="btn" @onclick="@(() => LoadTaskDetailsForTask(MondayTasks[myIndex].Id))">
                        <a role="button">
                            <h4>@MondayTasks[i].Name</h4>
                            <p>@MondayTasks[i].DeadlineDate.Date.ToShortDateString()</p>
                        </a>
                    </li>
                }
            </ul>
    ...

private async Task LoadTaskDetailsForTask(int taskId)
{
    SelectedTaskId = taskId;
    IsTaskDetailsVisible = true;
    await JSRuntime.InvokeVoidAsync("onScrollEvent");
}
public void RemoveTaskDetails()
{
    IsTaskDetailsVisible = false;
    StateHasChanged();
}

子组件(TaskDetails.razor)

@if (IsVisible)
{
    ...
            <div class="row">
                <h2 class="inner-div title">@taskDetails.Name</h2>
                <span class="closebtn" @onclick="()=> ToggleVisibility()">&times;</span>
            </div>

    //Display Information
}

...
[CascadingParameter]
public TaskList _Parent { get; set; }

protected async override void OnParametersSet()
{
    taskDetails = await _dbTasks.GetTasksDetails(TaskId);
    TaskItems = await _dbTasks.GetTasksItems(TaskId);
    this.StateHasChanged();
}

private void ToggleVisibility()
{
    _Parent.RemoveTaskDetails();
}

【问题讨论】:

  • 你能分享a minimal reproducible example吗?
  • @vernou 我可以,但我认为这是一个如此广泛的问题,举个例子也无济于事。此外,这并不是我的代码有错误,而是可能是解决问题的错误方法。
  • 也许这个教程能帮上忙:Build a blazor todo list app

标签: blazor blazor-component


【解决方案1】:

你有

[Parameter] bool IsVisible  {get; set; }
private void ToggleVisibility()
{
    IsVisible = !IsVisible;
}

这是一种要避免的模式:不要从组件内部更改参数。

您必须添加一个 EventCallback 并更改主组件上的 IsTaskDetailsVisible。

【讨论】:

  • 做到了,谢谢。你能检查一下我更新的问题,看看这是否是正确的方法(如果没有指出正确的方向)吗?
  • 我现在无法检查,但是当级联父级正常时,它不会在父级上触发 StateHasChanged。稍后我会添加一个 EventCallback 示例。
  • 好的,谢谢。只是补充一下,以防你没有注意到我手动添加了StateHasChanged()
  • 哦,是的,我没看到。它会完成这项工作。
猜你喜欢
  • 1970-01-01
  • 2021-07-04
  • 2022-12-22
  • 2020-04-01
  • 2021-06-29
  • 2022-10-23
  • 2018-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多