【发布时间】:2021-05-22 05:13:51
【问题描述】:
我有一个 Blazor 项目,它加载包含 razor 组件的 DLL。为了在客户端渲染这些动态组件,我使用渲染树构建器从动态组件创建一个RenderFragment 并将其放置在页面上以显示该组件。但是,我在创建渲染树时找不到绑定值的方法。通常情况下,我可以使用下面的父子组件示例传递数据,但是在将动态组件转换为RenderFragment时不知道该怎么做。
父组件
@page "/ParentComponent"
<h1>Parent Component</h1>
<ChildComponent @bind-Password="_password" />
@code {
private string _password;
}
子组件
<h1>Child Component</h1>
Password:
<input @oninput="OnPasswordChanged"
required
type="@(_showPassword ? "text" : "password")"
value="@Password" />
<button class="btn btn-primary" @onclick="ToggleShowPassword">
Show password
</button>
@code {
private bool _showPassword;
[Parameter]
public string Password { get; set; }
[Parameter]
public EventCallback<string> PasswordChanged { get; set; }
private Task OnPasswordChanged(ChangeEventArgs e)
{
Password = e.Value.ToString();
return PasswordChanged.InvokeAsync(Password);
}
private void ToggleShowPassword()
{
_showPassword = !_showPassword;
}
}
动态组件到RenderFragment
下面的代码显示了我如何通过将组件转换为RenderFragment 在页面上显示组件。你知道我如何在渲染树构建器中绑定一个变量,以将数据从动态组件传递到父页面吗?
注意:这个动态组件@dynamicComponent和上面的子组件一样,我想从中获取密码数据。
@page "/{ComponentName}"
@inject IComponentService ComponentService
@if (render)
{
@dynamicComponent()
@_password;
}
@code{
private string _password;
[Parameter]
public string ComponentName { get; set; }
bool render = false;
protected override void OnInitialized()
{
render = true;
base.OnInitialized();
}
RenderFragment dynamicComponent() => builder =>
{
RazorComponentModel component = ComponentService.GetComponentByPage(ComponentName);
builder.OpenComponent(0, component.Component);
for (int i = 0; i < component.Parameters.Count; i++)
{
var attribute = component.Parameters.ElementAt(i);
builder.AddAttribute(i + 1, attribute.Key, attribute.Value);
}
builder.CloseComponent();
};
}
【问题讨论】: