【问题标题】:Element reference null in BlazorBlazor 中的元素引用 null
【发布时间】:2022-01-01 14:01:22
【问题描述】:

我有以下 html 剃须刀代码

<StEyth @ref="stEyth"></StEyth>
<Gr1D @ref="gr1D" ></Gr1D>

 

@code 中的以下代码

@code {     
 private Gr1D?  gr1D;
 private StEyth? stEyth;
 protected override async Task OnInitializedAsync()    
 {
   await updateView();
 }
 private async Task updateView()    
 {
   DrpdVal = new IpDrpdValues { ar1 = gr1D.ar1}
   await stEyth.updateView(DrpdVal);
 }
}

但代码到达时gr1D为空

DrpdVal = new IpDrpdValues { ar1 = gr1D.ar1}

知道为什么吗? 我怎样才能得到 Gr1D 中变量的值?

【问题讨论】:

    标签: .net blazor ref


    【解决方案1】:

    如果您在对UpdateView 的调用之前添加yield,则组件运行它的初始渲染并且子组件存在。

        protected override async Task OnInitializedAsync()
        {
            await Task.Yield();
            await UpdateView();
        }
    

    但是,如果我正确阅读了您上面的评论,那么您正在尝试协调组件之间的数据交换。这非常危险:您无法控制渲染和更新过程。您应该考虑使用服务来保存您的数据,以及您的组件可以订阅的通知事件。

    【讨论】:

      【解决方案2】:

      @ref 在渲染期间设置。 OnInitialized 在第一次渲染之前执行。

      因此,执行此操作的合乎逻辑的位置是在 OnAfterRender 中。使用 firstRender 只做一次。

      protected override async Task OnAfterRenderAsync(bool firstRender)
      {
        if (firstRender)
        {
          await updateView();
        }
      }
      

      【讨论】:

      • 这是正确的,但请检查我编辑的代码。在等待 stEyth.updateView(DrpdVal); updateview 运行但不影响组件 stEyth 的视图。我想要做的是从 gr1D 组件中获取一些变量值并将它们传递给组件 stEyth。之后应该更新 stEyth 视图
      • 这不是组件之间通信的最佳方式。但是在stEyth.updateView(DrpdVal) 中调用StateHasChanged() 可能会解决直接问题。
      • 好的,谢谢!最后一个问题,组件之间通信的最佳方式是什么?
      • 要么使用父级的参数提供它,要么级联一个服务(并使用通知事件)。这在很大程度上取决于数据的类型、变化方式等。文档有一两个关于“Blazor 状态管理”的页面。
      • 就我而言,在 Gr1D 中,我想从下拉列表中选择值,然后将这些选择的值用于其他组件
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-19
      • 2020-05-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多