在 Blazor 中更新父组件后重新加载子组件
Reload child component after updating parent in Blazor
我的应用程序中有一些项目的详细信息页面。此详细信息页面包含一个概述部分和概述部分下的几个选项卡。
用户可以更新概览部分,更新成功后我需要重新加载概览部分下的选项卡。
我正在使用 MatBlazor 来呈现选项卡。我需要在父组件更新后重新呈现选项卡。典型的方法是将回调传递给子组件。但是这里的子组件(具体来说是选项卡)是 RenderFragment,它是一个委托。
这是父组件中选项卡的剃刀代码部分:
<div class="jds-shadow-soft-xxs jds-radius-l min-height100p pt1">
<MatTabGroup Class="jobTabs">
@foreach (var tab in tabs)
{
<MatTab>
<LabelContent>
@tab.Label
</LabelContent>
<ChildContent>
@tab.Content
</ChildContent>
</MatTab>
}
</MatTabGroup>
</div>
MatBlazor 使用 RenderFragment 渲染选项卡内容。这是我在 RenderFragment
选项卡的父组件中的代码
List<JobConfiguartionTabItem> tabs = new List<JobConfiguartionTabItem>();
protected override async Task OnInitializedAsync()
{
try
{
tabs.AddRange(new List<JobConfiguartionTabItem> {
new JobConfiguartionTabItem(){Label = "Scheduled Activities",Content = GetRenderFragment(typeof(JobTemplateScheduleActivityComponent))},
new JobConfiguartionTabItem(){Label = "Account Selection",Content = GetRenderFragment(typeof(AccountSelectionComponent))},
new JobConfiguartionTabItem(){Label = "Schedule",Content = GetRenderFragment(typeof(JobTemplateScheduleComponent))},
new JobConfiguartionTabItem(){Label = "Scheduled History",Content = GetRenderFragment(typeof(JobTemplateScheduledJobComponent))}
}
);
// fetching initial data for the parent component
await this.GetData();
}
catch (Exception exp)
{
Console.WriteLine("Error: " + exp);
}
}
这是JobConfigurationTabItem
class
public class JobConfiguartionTabItem
{
public string Label { get; set; }
public RenderFragment Content { get; set; }
}
这里是父组件中的GetRenderFragment
方法
private RenderFragment GetRenderFragment(Type component)
{
RenderFragment renderFragment = renderTreeBuilder =>
{
renderTreeBuilder.OpenComponent(0, component);
renderTreeBuilder.CloseComponent();
};
return renderFragment;
}
为了简化我的要求:我需要从父组件引发一个事件,子组件应该使用处理程序方法处理该事件。在我的例子中,子组件是 RenderFragment。我找不到通过RenderFragment实现的方法。
好的,我已经解决了这个问题。我的情况是 Parent 组件需要与 child 组件通信。当 parent 更新时,它需要告诉 child 自己重新加载/ re-render。
一种典型的方法是在 parent 的 child 标记中放置一个 @ref
关键字来捕获引用。然后我们可以通过 ref.
调用 child 的任何方法
在我的例子中,我使用的是 RenderFragment
,它不是 child 的实例,而是委托。
我重构了 GetRenderFragment
方法来捕获目标 child 的引用。
private JobTemplateScheduleActivityComponent jobTemplateScheduleActivityComponent { get; set; }
private RenderFragment GetRenderFragment(Type component)
{
RenderFragment renderFragment = renderTreeBuilder =>
{
renderTreeBuilder.OpenComponent(0, component);
if (component == typeof(JobTemplateScheduleActivityComponent))
{
// capturring RenderFragment component reference
renderTreeBuilder.AddComponentReferenceCapture(1, (_value =>
{
jobTemplateScheduleActivityComponent = (JobTemplateScheduleActivityComponent)_value;
}));
}
renderTreeBuilder.CloseComponent();
};
return renderFragment;
}
我在parent到运行更新后有如下方法:
protected async Task RunAfterUpdate()
{
await this.GetData();
// calling the reload method of the target child
await jobTemplateScheduleActivityComponent.Reload();
StateHasChanged();
}
RenderTreeBuilder.AddComponentReferenceCapture
是我寻找的捕获 RenderFragment
.
引用的方法
我的应用程序中有一些项目的详细信息页面。此详细信息页面包含一个概述部分和概述部分下的几个选项卡。
用户可以更新概览部分,更新成功后我需要重新加载概览部分下的选项卡。
我正在使用 MatBlazor 来呈现选项卡。我需要在父组件更新后重新呈现选项卡。典型的方法是将回调传递给子组件。但是这里的子组件(具体来说是选项卡)是 RenderFragment,它是一个委托。 这是父组件中选项卡的剃刀代码部分:
<div class="jds-shadow-soft-xxs jds-radius-l min-height100p pt1">
<MatTabGroup Class="jobTabs">
@foreach (var tab in tabs)
{
<MatTab>
<LabelContent>
@tab.Label
</LabelContent>
<ChildContent>
@tab.Content
</ChildContent>
</MatTab>
}
</MatTabGroup>
</div>
MatBlazor 使用 RenderFragment 渲染选项卡内容。这是我在 RenderFragment
选项卡的父组件中的代码List<JobConfiguartionTabItem> tabs = new List<JobConfiguartionTabItem>();
protected override async Task OnInitializedAsync()
{
try
{
tabs.AddRange(new List<JobConfiguartionTabItem> {
new JobConfiguartionTabItem(){Label = "Scheduled Activities",Content = GetRenderFragment(typeof(JobTemplateScheduleActivityComponent))},
new JobConfiguartionTabItem(){Label = "Account Selection",Content = GetRenderFragment(typeof(AccountSelectionComponent))},
new JobConfiguartionTabItem(){Label = "Schedule",Content = GetRenderFragment(typeof(JobTemplateScheduleComponent))},
new JobConfiguartionTabItem(){Label = "Scheduled History",Content = GetRenderFragment(typeof(JobTemplateScheduledJobComponent))}
}
);
// fetching initial data for the parent component
await this.GetData();
}
catch (Exception exp)
{
Console.WriteLine("Error: " + exp);
}
}
这是JobConfigurationTabItem
class
public class JobConfiguartionTabItem
{
public string Label { get; set; }
public RenderFragment Content { get; set; }
}
这里是父组件中的GetRenderFragment
方法
private RenderFragment GetRenderFragment(Type component)
{
RenderFragment renderFragment = renderTreeBuilder =>
{
renderTreeBuilder.OpenComponent(0, component);
renderTreeBuilder.CloseComponent();
};
return renderFragment;
}
为了简化我的要求:我需要从父组件引发一个事件,子组件应该使用处理程序方法处理该事件。在我的例子中,子组件是 RenderFragment。我找不到通过RenderFragment实现的方法。
好的,我已经解决了这个问题。我的情况是 Parent 组件需要与 child 组件通信。当 parent 更新时,它需要告诉 child 自己重新加载/ re-render。
一种典型的方法是在 parent 的 child 标记中放置一个 @ref
关键字来捕获引用。然后我们可以通过 ref.
在我的例子中,我使用的是 RenderFragment
,它不是 child 的实例,而是委托。
我重构了 GetRenderFragment
方法来捕获目标 child 的引用。
private JobTemplateScheduleActivityComponent jobTemplateScheduleActivityComponent { get; set; }
private RenderFragment GetRenderFragment(Type component)
{
RenderFragment renderFragment = renderTreeBuilder =>
{
renderTreeBuilder.OpenComponent(0, component);
if (component == typeof(JobTemplateScheduleActivityComponent))
{
// capturring RenderFragment component reference
renderTreeBuilder.AddComponentReferenceCapture(1, (_value =>
{
jobTemplateScheduleActivityComponent = (JobTemplateScheduleActivityComponent)_value;
}));
}
renderTreeBuilder.CloseComponent();
};
return renderFragment;
}
我在parent到运行更新后有如下方法:
protected async Task RunAfterUpdate()
{
await this.GetData();
// calling the reload method of the target child
await jobTemplateScheduleActivityComponent.Reload();
StateHasChanged();
}
RenderTreeBuilder.AddComponentReferenceCapture
是我寻找的捕获 RenderFragment
.