【问题标题】:Blazor CascadingParameter - between MainLayout.razor and NavMenu.razorBlazor CascadingParameter - MainLayout.razor 和 NavMenu.razor 之间
【发布时间】:2020-04-18 20:34:34
【问题描述】:

我有使用 VS Blazor 模板创建的基本 Blazor 应用程序。默认情况下,它会创建 MainLayout.razor 和 NavMenu.razor。 MainLayout 像这样托管 Navmenu:

<NavMenu/>

我需要传递一个值(从 MainLayout 到 Navmenu 的对象 - 以更新导航按钮。 我正在尝试使用 CascadingParameter,但似乎无法正常工作。

MainLayout.razor 我添加了:

 <CascadingValue Value="@X" >
        <NavMenu/>
    </CascadingValue>

@code {

    public string X { get; set; }

  protected override async Task OnInitializedAsync()
    {
           X = "PASS SOMETHING";

NavMenu.razor 我添加了以下内容

@code {

    [CascadingParameter]
    string X { get; set; }

然后

 protected override async Task OnInitializedAsync()
    {
         Console.WriteLine(X);

但 X 始终为 Null。有任何想法吗?我错过了什么?

【问题讨论】:

    标签: blazor


    【解决方案1】:

    由于 NavMenu 是 MainLayout 的子组件,您可以将组件参数传递给 NavMenu。执行以下操作:

    在 NavMenu 中定义一个公共属性来存储从父级传递的值

    NavMenu.razor

     @code {
         [Parameter]
         public string Value { get; set; }
    
     }
    

    在 MainLayout 中这样做:

    <div class="sidebar">
        <NavMenu Value="@SomeValue" />
    </div>
    
    
    @code{
    
        private string SomeValue = "A value from MainLayout";
     }
    

    就是这样……

    但是,如果您坚持使用在当前情况下确实不合适的 CascadingValue,您可以这样做:

    NavMenu.razor

      @code {
         [CascadingParameter]
         public string Value { get; set; }
    
         protected override async Task OnInitializedAsync()
         {
              Console.WriteLine(Value);
    
              await Task.CompletedTask;
         }
      }
    

    在 MainLayout 中这样做:

     <div class="sidebar">
        <CascadingValue Value="@SomeValue">
            <NavMenu />
        </CascadingValue>
     </div>
    
    
    
     @code{
    
         private string SomeValue = "A value from MainLayout";
     }
    

    【讨论】:

    • 有效。但是当我将字符串更改为客户对象并查询数据库以获取客户时。它首先将一个空 Customer 传递给 NavMenu,然后当我填充 SomeValue 时,它​​传递 Customer obj。我将一些值设置为 Onitialized - 就在我查询数据库并获取客户之后
    • 你不必使用字符串类型...你可以使用 typeparam 来传递泛型类型。请参阅模板化组件的文档示例如何使用 typeparam。
    猜你喜欢
    • 2020-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 2020-01-25
    • 2021-12-01
    • 2021-02-26
    • 2020-11-07
    相关资源
    最近更新 更多