Blazor中如何引用循环动态生成的Razor类库自定义控件实例
Blazor动态生成自定义控件的引用方案
方法1:通过@ref收集控件实例(直接满足需求)
这种方式可以直接拿到所有渲染完成的自定义控件实例,步骤如下:
- 在父页面定义一个存储控件引用的泛型列表,类型对应你的自定义控件类
- 在循环渲染控件时,通过
@ref特性将每个渲染完成的控件实例添加到列表中 - 需要调用控件方法时,直接遍历该列表即可
代码示例
父页面Razor部分:
<div class="col-12"> @foreach (MyModel new_control_model in p.list_of_control_models) { <myCustomControl model="new_control_model" @ref="AddControlToCache" /> } </div>
父页面@code部分:
@code{ // 存储所有动态生成的控件引用 private List<myCustomControl> _controlCache = new(); // 控件渲染完成后自动调用该方法,将实例加入缓存 private void AddControlToCache(myCustomControl control) { if (control != null && !_controlCache.Contains(control)) { _controlCache.Add(control); } } private void GetValues() { // 直接遍历缓存列表调用控件公开方法 foreach(var control in _controlCache) { control.YourPublicMethod(); } } // 若存在动态删除控件的场景,需补充引用清理逻辑: // 1. 自定义控件实现IDisposable接口,销毁时通知父页从_controlCache移除自身 // 2. 或在删除对应Model的同时清空_controlCache,重新渲染时会自动重建缓存 }
方法2:状态驱动模式(更符合Blazor设计思想,推荐优先使用)
Blazor是状态优先的框架,多数场景下不需要直接持有控件实例:
- 你需要调用控件方法获取的内容,都可以绑定到对应的
MyModel属性上 - 控件内部值变化时同步更新绑定的Model实例
- 需要获取所有控件值时,直接遍历
p.list_of_control_models即可,不需要操作控件本身
这种方式完全不需要处理引用生命周期,不会出现无效引用、内存泄漏等问题,耦合度更低。
内容的提问来源于stack exchange,提问作者jason
相关产品推荐
相关产品推荐

