c# - 如何在 Blazor 中保留组件实例
问题描述
我有一个类似的组件,我希望保存InnerComponent
第一次渲染的实例,并且每次都渲染相同的实例而不重新实例化它。
@if(isVisible)
{
<InnerComponent @ref="@_InnerComponent" @key="@("InnerComponentKey")">
@ChildContent
</InnerComponent>
}
@code{
[Parameter] public InnerComponent _InnerComponent { get; set; }
private bool IsVisible { get; set; }
}
当内部组件可见时,用户可以操纵其状态。但是如果IsVisible
设置为 false 然后再次设置为 true,则内部组件将被重新渲染覆盖_InnerComponent
,因此我们会丢失用户对该InnerComponent
实例所做的更改的跟踪。
添加 @key 似乎也无助于保留实例。它只是被重新渲染和覆盖:/我敢肯定,我在两次渲染时都给它提供了相同的密钥,但我不知道如何检查它所比较的密钥。
如果可以呈现组件实例,我可以执行以下操作,但我似乎无法找到这样做的方法。
@if(isVisible)
{
@if(_InnerComponent == null)
{
<InnerComponent @ref="@_InnerComponent" @key="@("InnerComponentKey")">
@ChildContent
</InnerComponent>
}
else
{
@_InnerComponent.Render()
}
}
我正在对我的问题提出批评,因为我没有问很多:)
提前致谢!
简化示例:
假设我们有以下组件,我将调用 `CounterContainer` ,其中 `<Counter>` 是默认 Blazor 项目模板中的计数器组件。@if(CounterIsVisible)
{
<Counter @ref="@_Counter" @key="@("CounterKey")" />
}
<button @onclick="() => CounterIsVisible = !CounterIsVisible">
Show/Hide counter
</button>
@code{
[Parameter] public Counter _Counter { get; set; }
private bool CounterIsVisible { get; set; } = true;
}
我想保存_Counter
实例,这样我就可以看到_Counter.currentCount
我数到的正确值。我可以使用本文中的方法保存它,但我发现它们都不实用,因为
- 我正在构建的组件具有比单个变量更多的数据
- 我只需要数据只要
CounterContainer
存在并且仅用于可视化 - 这对我的用例来说太复杂了
我已经Counter
存储了参考。我只想查看它而不是重新实例化它并覆盖整个内容。
希望这让它更清楚一点(:
解决方案
最佳选择:单独的视图和数据。您要保留的状态不应保存在组件内,而应保存在单独的 (ViewModel) 对象中。
简短的解决方案:始终渲染组件。使用 @isVisible 打开/关闭 css 类以隐藏它。
推荐阅读
- c++ - 在 C++ 中使用并行化的预期加速是多少(不是 OpenMp,而是
) - html - 如何在 HTML 中正确显示此代码段?
- php - 如何在 laravel 中使用数据透视表中的 3 个关系创建关系?
- javascript - 从 glMatrix 1 迁移到 glMatrix 2
- java - 如何初始化“if then”语句给出的变量?
- r - Installing tidyverse on Ubuntu 18.x & R 3.4.4/3.5.1
- swift - 是否可以在带有 openCv 的 iOS Swift 应用程序中使用 Realm 数据库?
- php - PHP,在动态循环周围添加 div 环绕
- database - 查找给定表 PostgreSQL 的直方图大小
- sql - 在 Excel 中运行 SQL 查询时出现日期错误