DynamicComponent将子从子发送给父母

发布于 2025-02-13 18:46:57 字数 3834 浏览 0 评论 0原文

我有一个代表用于创建dynamicComponent的必要数据:

public class ComponentMetadata
{
    public string? Name { get; set; }
    public Dictionary<string, object> Parameters { get; set; } = 
        new Dictionary<string, object>();
}

我有一个自定义表组件,它使用componentsmetadata将一些动态组件添加到表:

tabletemplate .RAZOR:

<table class="table">
    <thead>
        <tr>@TableHeader</tr>
    </thead>
    <tbody>
        @foreach (var RowTemplateConfig in RowTemplateConfigs)
        {
            if (RowTemplateConfig.DataItem is not null)
            {
                <tr>
                  <td> @RowTemplateConfig.DataItem </td>
                 
                 @if(RowTemplateConfig.ComponentMetadata is not null)
                 {
                  <td>
                    <DynamicComponent
                     Type= RowTemplateConfig.ComponentMetadata.Name
                     Parameters= RowTemplateConfig.ComponentMetadata.Parameters />
                  </td>
                 }
               </tr>
           }
       }
    </tbody>
</table>

@code {
    public class RowTemplateConfig 
    {
      public ComponentMetadata ComponentMetadata { get; set;}
      public string DataItem { get; set; }
    }
    [Parameter]
    public RenderFragment? TableHeader { get; set; }

    [Parameter]
    public List<RowTemplateConfig> RowTemplateConfigs {get; set;}
}

我还有其他自定义组件,例如按钮自定义组件:

mybutton.razor

<button type="button"
        class="@Style"
        @onclick="BtnClick">
@Text
</button>

@code {
 [Parameter]
 public string Style { get; set; }
 [Parameter]
 public string Text { get; set; }
 [Parameter]
 public EventCallback<object> OnBtnClick { get; set; }

 private async Task BtnClick(object item) 
 {
  await OnBtnClick.InvokeAsync(item);
 }
}

我想使用我的tabletemplate.razor在某些剃须刀页面中:

pets1.razor

@page "/pets1"

<h1>Pets</h1>

<TableTemplate RowTemplateConfigs =RowTemplateConfigs  TItem =string>
    <TableHeader>
        <th>Name</th>
    </TableHeader>
</TableTemplate>

@code {
    private List<RowTemplateConfig> RowTemplateConfigs = new()
    {
        RowTemplateConfig = new () 
        {
          DataItem = "Bigglesworth",
          ComponentMetadata = new()
          {
           Name= typeof(MyButton).
           Parameters = new Dictionary<string, object>()
           {
            { nameof(MyButton.Style), "btn btn-outline-success" }
            { nameof(MyButton.OnBtnClick),  EventCallback.Factory.Create<object>(this, OnTestClick)},
            { nameof(MyButton.Text), "Hi"}
           }
          }
        },
        RowTemplateConfig = new () 
        {
          DataItem = "Saberhagen",
          ComponentMetadata = new()
          {
           Name= typeof(MyButton).
           Parameters = new Dictionary<string, object>()
           {
            { nameof(MyButton.Style), "btn btn-outline-success" }
            { nameof(MyButton.OnBtnClick),  EventCallback.Factory.Create<object>(this, OnTestClick)},
            { nameof(MyButton.Text), "Hi"}
           }
          }
        },
       //rest of the lest ...
    }

 private async Task OnTestClick(object sender)
 {
  // I want to catch the name of the pet here when user click on the button
   await Task.Delay(20);
 }
}

我的问题:

当用户单击mybutton intabletemplate in pets1.razor我想在事件ontestClick中捕获元素(PET的名称)。

谢谢,很抱歉长期以来的问题,感谢任何建议。

I have a class that represents the necessary data for creating a DynamicComponent:

public class ComponentMetadata
{
    public string? Name { get; set; }
    public Dictionary<string, object> Parameters { get; set; } = 
        new Dictionary<string, object>();
}

I have a custom table component that uses ComponentMetadata to add some dynamic component to the table:

TableTemplate.razor:

<table class="table">
    <thead>
        <tr>@TableHeader</tr>
    </thead>
    <tbody>
        @foreach (var RowTemplateConfig in RowTemplateConfigs)
        {
            if (RowTemplateConfig.DataItem is not null)
            {
                <tr>
                  <td> @RowTemplateConfig.DataItem </td>
                 
                 @if(RowTemplateConfig.ComponentMetadata is not null)
                 {
                  <td>
                    <DynamicComponent
                     Type= RowTemplateConfig.ComponentMetadata.Name
                     Parameters= RowTemplateConfig.ComponentMetadata.Parameters />
                  </td>
                 }
               </tr>
           }
       }
    </tbody>
</table>

@code {
    public class RowTemplateConfig 
    {
      public ComponentMetadata ComponentMetadata { get; set;}
      public string DataItem { get; set; }
    }
    [Parameter]
    public RenderFragment? TableHeader { get; set; }

    [Parameter]
    public List<RowTemplateConfig> RowTemplateConfigs {get; set;}
}

I have also other custom components for example Button custom component:

MyButton.razor

<button type="button"
        class="@Style"
        @onclick="BtnClick">
@Text
</button>

@code {
 [Parameter]
 public string Style { get; set; }
 [Parameter]
 public string Text { get; set; }
 [Parameter]
 public EventCallback<object> OnBtnClick { get; set; }

 private async Task BtnClick(object item) 
 {
  await OnBtnClick.InvokeAsync(item);
 }
}

I want to use my TableTemplate.razor in some razor page:

pets1.razor

@page "/pets1"

<h1>Pets</h1>

<TableTemplate RowTemplateConfigs =RowTemplateConfigs  TItem =string>
    <TableHeader>
        <th>Name</th>
    </TableHeader>
</TableTemplate>

@code {
    private List<RowTemplateConfig> RowTemplateConfigs = new()
    {
        RowTemplateConfig = new () 
        {
          DataItem = "Bigglesworth",
          ComponentMetadata = new()
          {
           Name= typeof(MyButton).
           Parameters = new Dictionary<string, object>()
           {
            { nameof(MyButton.Style), "btn btn-outline-success" }
            { nameof(MyButton.OnBtnClick),  EventCallback.Factory.Create<object>(this, OnTestClick)},
            { nameof(MyButton.Text), "Hi"}
           }
          }
        },
        RowTemplateConfig = new () 
        {
          DataItem = "Saberhagen",
          ComponentMetadata = new()
          {
           Name= typeof(MyButton).
           Parameters = new Dictionary<string, object>()
           {
            { nameof(MyButton.Style), "btn btn-outline-success" }
            { nameof(MyButton.OnBtnClick),  EventCallback.Factory.Create<object>(this, OnTestClick)},
            { nameof(MyButton.Text), "Hi"}
           }
          }
        },
       //rest of the lest ...
    }

 private async Task OnTestClick(object sender)
 {
  // I want to catch the name of the pet here when user click on the button
   await Task.Delay(20);
 }
}

My Question:

When user clicks on MyButton in TableTemplate in pets1.razor I want to catch the element (name of pet) in the event OnTestClick.

Thanks and sorry for long question, I appreciate any suggestion.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

魔法唧唧 2025-02-20 18:46:57

您需要将PET名称参数添加到按钮组件,加载它,然后在回调事件中提交属性。

这是您的代码的修改版本(带有一些错别字和类型修复程序)。 注意:i用无效的启用代码。

componentMetadata

public class ComponentMetadata
{
    public Type Name { get; set; } = default!;
    public Dictionary<string, object> Parameters { get; set; } =
        new Dictionary<string, object>();
}

mybutton.razor

<button type="button" class="@Style" @onclick=BtnClick>
@Text
</button>

@code {
 [Parameter] public string? Style { get; set; }
 [Parameter] public string? Name { get; set; }
 [Parameter] public string? Text { get; set; }
 [Parameter] public EventCallback<string> OnBtnClick { get; set; }

 private async Task BtnClick() 
    =>  await OnBtnClick.InvokeAsync(this.Name);
}

,然后代码的其余部分汇入了我的测试页面:

@page "/"

@foreach (var component in myDynamicComponents)
{
    <DynamicComponent Type="@component.ComponentMetadata.Name" Parameters=component.ComponentMetadata.Parameters />
}

<div class="p-2 m-2">
    <strong>Message:</strong> @message
</div>
@code {
    private string message = string.Empty;

    private RowTemplateConfig GetRowTemplate(string petName)
        => new RowTemplateConfig
            {
                DataItem = petName,
                ComponentMetadata =
                new ComponentMetadata()
                {
                    Name = typeof(MyButton),
                    Parameters = new Dictionary<string, object>()
                       {
                    { nameof(MyButton.Style), "btn btn-outline-success ms-1" },
                    { nameof(MyButton.Name), petName },
                    { nameof(MyButton.OnBtnClick),  EventCallback.Factory.Create<string>(this, OnTestClick)},
                    { nameof(MyButton.Text), $"Hi {petName}"}
                       }
                }
            };

    private List<RowTemplateConfig> myDynamicComponents => new List<RowTemplateConfig> {
            GetRowTemplate("Ginger"),
            GetRowTemplate("Tiger"),
            GetRowTemplate("Felix")
        };

    private async Task OnTestClick(string name)
    {
        await Task.Delay(20);
        message = $"{name} Clicked at {DateTime.Now.ToLongTimeString()}";
    }

    public class RowTemplateConfig
    {
        public ComponentMetadata ComponentMetadata { get; set; } = default!;
        public string? DataItem { get; set; }
    }

}

You need to add a Pet Name parameter to the button component, load it and then submit the property back on the callback event.

Here's a modified version of your code (with a few typo and type fixes). Note: I code with Nullable enabled.

ComponentMetadata

public class ComponentMetadata
{
    public Type Name { get; set; } = default!;
    public Dictionary<string, object> Parameters { get; set; } =
        new Dictionary<string, object>();
}

MyButton.razor

<button type="button" class="@Style" @onclick=BtnClick>
@Text
</button>

@code {
 [Parameter] public string? Style { get; set; }
 [Parameter] public string? Name { get; set; }
 [Parameter] public string? Text { get; set; }
 [Parameter] public EventCallback<string> OnBtnClick { get; set; }

 private async Task BtnClick() 
    =>  await OnBtnClick.InvokeAsync(this.Name);
}

And then the rest of the code rolled into my test page:

@page "/"

@foreach (var component in myDynamicComponents)
{
    <DynamicComponent Type="@component.ComponentMetadata.Name" Parameters=component.ComponentMetadata.Parameters />
}

<div class="p-2 m-2">
    <strong>Message:</strong> @message
</div>
@code {
    private string message = string.Empty;

    private RowTemplateConfig GetRowTemplate(string petName)
        => new RowTemplateConfig
            {
                DataItem = petName,
                ComponentMetadata =
                new ComponentMetadata()
                {
                    Name = typeof(MyButton),
                    Parameters = new Dictionary<string, object>()
                       {
                    { nameof(MyButton.Style), "btn btn-outline-success ms-1" },
                    { nameof(MyButton.Name), petName },
                    { nameof(MyButton.OnBtnClick),  EventCallback.Factory.Create<string>(this, OnTestClick)},
                    { nameof(MyButton.Text), 
quot;Hi {petName}"}
                       }
                }
            };

    private List<RowTemplateConfig> myDynamicComponents => new List<RowTemplateConfig> {
            GetRowTemplate("Ginger"),
            GetRowTemplate("Tiger"),
            GetRowTemplate("Felix")
        };

    private async Task OnTestClick(string name)
    {
        await Task.Delay(20);
        message = 
quot;{name} Clicked at {DateTime.Now.ToLongTimeString()}";
    }

    public class RowTemplateConfig
    {
        public ComponentMetadata ComponentMetadata { get; set; } = default!;
        public string? DataItem { get; set; }
    }

}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文