v.a*_*a.v 2 c# asp.net-core blazor blazor-server-side blazor-client-side
我想不出如何实现以下目标:
我需要将参数集合(或数组)传递给 Blazor 组件。传递的参数是 Blazor 组件。参数集合必须作为嵌套标签传递。必须能够分别调用每个传递的参数组件的渲染。
也就是说,我想要这样的东西:
<MyComponent>
<ParameterCollection>
<MyParameterComponent1>Caption1</MyParameterComponent1>
<MyParameterComponent2>Caption2</MyParameterComponent2>
<MyParameterComponent3>Caption3</MyParameterComponent3>
</ParameterCollection>
</MyComponent>
Run Code Online (Sandbox Code Playgroud)
我的组件代码:
@code{
[Parameter]
public RenderFragment[] ParameterCollection {get; set;} //Runtime error
}
Run Code Online (Sandbox Code Playgroud)
我想要得到的显然是在这里实现的商业 Blazor 组件(选择 VIEW SOURCE 选项卡)。GridColumns 参数被传递到 GridColumn 组件的集合。更准确地说,在我看来,它是它们对应的 RenderFragment 的集合。问题是它是如何完成的?
反过来:DatagGridColumnCollection 组件将自身作为 CascadingValue 插入,而 DatagGridColumn 组件仅调用 Add 方法。
<CascadingValue Value="this">
@ChildContent
</CascadingValue>
@code
{
public void Add(DataGridColumn colum) { ... }
}
Run Code Online (Sandbox Code Playgroud)
@code {
[CascadingParameter]
private ColumnCollection Parent { get; set; }
protected override void OnInitialized()
{
if (Parent != null) Parent.Add(this);
}
}
Run Code Online (Sandbox Code Playgroud)
Blazor 无法获取渲染片段集合作为参数。这里有两种不同的方法,您可以将动态组件计数作为参数传递
<MyComponent>
<ParameterCollection>
<MyParameterComponent1>Caption1</MyParameterComponent1>
<MyParameterComponent2>Caption2</MyParameterComponent2>
<MyParameterComponent3>Caption3</MyParameterComponent3>
</ParameterCollection>
</MyComponent>
Run Code Online (Sandbox Code Playgroud)
@code{
[Parameter]
public RenderFragment ParameterCollection {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
您可以将它们放置@ParameterCollection在.razor文件中的任何位置。
这是这种方法的一个工作示例:https : //blazorrepl.com/repl/QaFEadlQ52kWHVkX13
在这种方法中,您仅使用组件来传递一些元数据 - 类似于@Henk Holterman 的建议:
<MyComponent>
<ParameterCollection>
<MyParameterComponent1>Caption1</MyParameterComponent1>
<MyParameterComponent2>Caption2</MyParameterComponent2>
<MyParameterComponent3>Caption3</MyParameterComponent3>
</ParameterCollection>
</MyComponent>
Run Code Online (Sandbox Code Playgroud)
@code{
[Parameter]
public RenderFragment ParameterCollection {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
通过这种方式,您可以将 @ParameterCollection 放在.razor文件的开头,并包装在 Parent 组件的 CascadingValue 中。这将触发所有子组件的渲染。
在每个组件的初始化中,您需要触发向父级填充元数据:
@code {
[CascadingParameter]
private MyComponent Parent { get; set; }
protected override void OnInitialized()
{
if (Parent != null) Parent.AddChild(this);
}
}
Run Code Online (Sandbox Code Playgroud)
收到元数据后,你只需要再次触发渲染并在
这是一个工作示例:https : //blazorrepl.com/repl/wuPOOxvd06vFcWFG21
| 归档时间: |
|
| 查看次数: |
2321 次 |
| 最近记录: |