如何在 Blazor 中引用通过 DynamicComponent 创建的组件?

Posted

技术标签:

【中文标题】如何在 Blazor 中引用通过 DynamicComponent 创建的组件?【英文标题】:how can I refer to a component created via DynamicComponent in Blazor? 【发布时间】:2021-08-14 01:58:17 【问题描述】:

我正在使用 DinamicComponent 渲染组件,我需要调用在子组件中找到的函数。 我找不到对 DinamicComponents 使用 @ref 的等价物,以便我可以引用来调用该函数。

这是父组件

 <div class="tab-content">
            @foreach (VerticalTabComponent.TabModel oneTabItem in VerticalTabsList)
            
                <div class="tab-pane fade show @(oneTabItem.TabIndex == SelectedTabIndex ? "active" : "")" @key=@($"VTabDivDynamic_TabPrefix_oneTabItem.TabIndex.ToString()")>
                    <DynamicComponent
                              Type=@System.Type.GetType(oneTabItem.TabComponent)
                              Parameters=@oneTabItem.TabParameters>
                    </DynamicComponent>
                </div>
            
        </div>

这是 Blazor 组件选项卡中的代码

 public partial class TabComponent

    [Parameter]
    public EventCallback<string> InsertUpdateCallback  get; set; 

    
    protected override async Task OnInitializedAsync()
    
       await CallAnyfunctionAsync();
    
    private async Task<bool> LoadDataGrid()
    
       //this is the function I need to call from parent
    

如何从父组件调用Load Grid函数?

【问题讨论】:

【参考方案1】:

通常在 Blazor 中,我们使用 @Ref 来获取对组件的引用,但正如您所见,这不适用于 DynamicComponent

解决此问题的方法是将[Parameter] 添加到名为Register 之类的组件中,这是一个将泛型类型设置为组件类型的操作。然后您可以添加代码来处理OnParametersSet 以在组件中调用此方法。

然后,您可以在 TabParameters 中添加一个 Register 参数,该参数会通过引用进行更新。

下面的示例代码将被添加到SurveyPrompt 组件中:

    /// <summary>
    ///  will be called when params set
    /// </summary>
    [Parameter] public  Action<SurveyPrompt> Register  get; set; 

    protected override void OnParametersSet()
    
        if (Register != null)
        
            // register this component
                Register(this);
        
    

您添加一个带有Action&lt;type&gt; 值的Register 参数。这是一个例子:

    SurveyPrompt sp1 = null;


    void Register1(SurveyPrompt survey)
    
        sp1 = survey;
        Console.WriteLine("SP1 has title " + sp1.Title);
    

    protected override void OnInitialized()
    
        Action<SurveyPrompt> p1 = Register1;

        params1 = new Dictionary<string, object>()
        
             "Title", "Survey Title Here" ,
             "Register", p1 
        ;
    

    IDictionary<string, object> params1;

【讨论】:

这很好,但是在您的示例代码中,SurveyPrompt 的含义很令人困惑?它代表父组件吗?还是一个单独的班级?

以上是关于如何在 Blazor 中引用通过 DynamicComponent 创建的组件?的主要内容,如果未能解决你的问题,请参考以下文章

在已发布主机上引用 Blazor 服务器端中的静态文件

Blazor WebAssembly Server 项目如何引用客户端索引?

Blazor WebAssembly Server 项目如何引用客户端索引?

首次渲染时 Blazor 组件引用为空

ServiceStack:添加 Blazor 支持?

如何通过 Blazor WebAssembly 写入浏览器控制台?