我的 Blazor(.NET 8)页面有一个组件列表,针对数据库查询响应中的每一行生成一个组件:
@foreach (var item in _listOfItems)
{
<CollapsibleCard Title="item.CardTitle">
other contest based on item..
</CollapsibleCard>
}
其中CollapsibleCard
是我制作的一个组件,它包装了 Bootstrap card
,添加了折叠/展开按钮,并且折叠/展开状态是使用 Blazor 代码管理的(即不在 Javascript 级别)。
我希望页面上有一个按钮可以立即折叠或展开所有卡片。该组件有一种折叠或展开它的方法。我可以在按钮的处理程序中添加什么代码onclick
来遍历所有这些卡片?
对于固定数量的卡片,我可以@ref
对每张卡片使用定义,但不确定在可能有任意数量组件的情况下它将如何工作。
注意:我之前曾尝试过为展开/折叠状态添加一个参数,但通常发现这种方法不起作用:如果您尝试从组件内部修改参数的值(当用户单击卡片上的按钮将其展开时就会发生这种情况),编译器会发出警告,并且从组件外部更改参数的值不会执行任何操作,因为组件不知道重新渲染自身,您必须遍历组件以重新渲染它们,或者重新渲染整个页面。
您需要将级联状态对象与事件一起使用。使用
@ref
并不是一条出路。这是 Blazor 中使用的常见通知模式。如果您搜索“Blazor 通知模式”,您会找到有关该主题的多个答案。您可以级联表单级上下文的状态对象,也可以将其注册为SPA 会话级上下文的范围服务。
这是一个快速而肮脏的演示。
一张非常简单的卡片
和演示页面