blazor - Blazor - 动态调用组件(按字符串)
问题描述
有没有一种优雅的方法可以通过名称作为字符串动态调用 blazor 组件。
而不是使用:
<User />
我想像在 Vue 框架中一样调用它:
<component :is="User" />
我找到了一个解决方案,但它不是很优雅:
@dynamicComponent("App.Pages.User")
@code {
RenderFragment dynamicComponent(string name) => builder =>
{
Type type = Type.GetType(name);
builder.OpenComponent(0, type);
builder.CloseComponent();
};
}
有任何想法吗?
解决方案
我认为,例如,假设我们已经定义了三个组件,
- TabParent.razor
- Tab.razor
- TabContent.razor
以下是它们的用法:
<TabParent CurrentTab="@currentTabName">
<Tab @OnClick="@(() => swapTab("tab1"))">Tab 1</Tab>
<Tab @OnClick="@(() => swapTab("tab2"))">Tab 2</Tab>
<TabContent Name="tab1">
Any other Components here
</TabContent>
<TabContent Name="tab2">
Any other Components here
</TabContent>
</TabParent>
@code {
string currentTabName;
void swapTab(string tabName)
{
currentTabName = tabName;
}
}
这是TabParent
组件:
<div>
<CascadingValue Name="CurrentTab" Value="@CurrentTab">
@ChildContent
</CascadingValue>
</div>
@code {
[Parameter]
public string CurrentTab { get; set; }
[Parameter]
public RenderFragment ChildContent { get; set; }
}
这是TabChild
组件:
@if(CurrentTab == TabName) // <-- this way the component won't render unless it is the current tab
{
<div class="tab-content">
@ChildContent
</div>
}
@code {
[CascadingParameter(Name="CurrentTab")]
public string CurrentTab { get; set; }
[Parameter]
public string TabName { get; set; }
[Parameter]
public RenderFragment ChildContent { get; set; }
}
推荐阅读
- react-native - 如何使用 ReactNative 和 Redux 获取 API 数据
- docker - 为什么 SELinux 拒绝访问容器内部文件并声称它们为“unlabled_t”?
- python - 为什么我的程序不能正确解释用户的输入?
- php - 在 mysql 和 php 中找到重复的条目,并在下面列出所有条目
- ionic-framework - screen.png:错误:从输入读取失败:PNG 块类型太大?
- php - trying to import sql fle , but facing this error
- websphere - Change root directory of WebSphere Application Server Traditional ND V9
- json - 如何从这个 JSON 读取数据并将其绑定到 Angular 2+ 中的选择下拉列表
- c++ - 流中的输入位置和输出位置有什么区别?
- algorithm - Generate all numbers by deleting digits of a given number