无法制作嵌套组件

Posted

技术标签:

【中文标题】无法制作嵌套组件【英文标题】:Can't make nested components 【发布时间】:2020-11-27 12:28:58 【问题描述】:

抱歉,如果问题与我缺乏经验有关。我正在尝试制作一个组件库来处理来自 blazor 的地图框。现在我有一个主要组件 MapBoxView,它显示地图和 MapboxGeocoder,用于查找对象。每个组件在主组件 OnFirstAfterRenderAsync() 中都有一个过程:

protected async override Task OnFirstAfterRenderAsync()

    await base.OnFirstAfterRenderAsync();
    Dictionary<string, object> o = new Dictionary<string, object>();
    ...
    await JsInvokeAsync<object>("mapgl.mymap.initMap", o);

在嵌套组件中:

protected async override Task OnFirstAfterRenderAsync()

    await base.OnFirstAfterRenderAsync();
    Dictionary<string, object> o = new Dictionary<string, object>();
    o.Add("container", container);
    await JsInvokeAsync<object>("mapgl.mygeocoder.initGeocoder", o);

在演示程序中我使用代码:

@page "/"

<MapBoxView zoom=@_zoom container=@containerName mapCenter=@centerOfView>
</MapBoxView>

<MapBoxGeocoder Id="geocoder">
</MapBoxGeocoder>

然后一切正常,我得到了我想要的图片:

在演示程序中我使用代码:

<MapBoxView zoom=@_zoom container=@containerName mapCenter=@centerOfView>
    <MapBoxGeocoder Id="geocoder">
    </MapBoxGeocoder>
</MapBoxView>

也就是说,我把嵌套组件放在了main中,然后geocoder(左下角有文字的窗口-图片上的搜索)没有显示,程序也没有进入MapBoxGeocoder组件的OnFirstAfterRenderAsync()过程。 主组件 MapBoxView 有剃须刀代码:

@namespace MapBoxBlazor

@inherits BaseMapBoxView

    <div id='mapContainer'>
    </div>

我做错了什么?怎么做才对?

【问题讨论】:

【参考方案1】:

您应该查看有关 ChildContent 的文档。

您需要使用名为ChildContentRenderFragment 来允许您渲染嵌套组件。

父组件必须有属性

public RenderFragment ChildContent  get; set; 

然后在你想要的地方渲染它。例如

<div> 
    @ChildContent
</div>

并且这个属性会渲染父组件内的所有东西。

所以对于你的情况,MapBoxView 应该有 ChildContent 并在里面渲染它才能工作。

【讨论】:

非常感谢。我知道这种方式。问题是,也许有一种方法可以处理“div”——在其中可以插入任意其他标签。虽然如果我知道 html 标签是如何实现的,那么显然这是不可能的。将其他标签放置在地图(地理编码器等)标签内会很舒服,而不会影响地图标签

以上是关于无法制作嵌套组件的主要内容,如果未能解决你的问题,请参考以下文章

Vue.js 2 中的嵌套组件

无法将具有特征的父组件中的选定数据数组传递给嵌套组件

在 Mongoose 中保存模型无法保存嵌套组件

无法使用带有样式组件的关键帧设置嵌套动画的样式

将嵌套对象名称作为道具传递给组件

反应嵌套路由无法正常工作