【问题标题】:Is there a way to have the layout initialization(async) come before the page body initialization?有没有办法让布局初始化(异步)在页面主体初始化之前出现?
【发布时间】:2021-06-25 20:41:07
【问题描述】:

今天我对这个发现感到惊讶。 OnInitializedAsync() 上的 Blazor 布局调用在页面拥有 OnInitializedAsync() 之后被调用,当我想要获取用户设置并将它们缓存在 localStorage 中时会出现问题,以便以后每个页面都可以收集并根据此设置采取适当的行动。

应该是这样的吗?如果是,是否有任何解决方法可以使布局初始化在提交页面初始化之前结束?

或者还有另一种可能性,即:鉴于所有这些调用都是异步的(既节省了localStorageGET 的用户设置),可能有一个时间范围内一个任务完成得比另一个。

【问题讨论】:

  • 您描述的是服务的工作,而不是布局。这些设置与向用户显示的内容无关,因此不应由组件或页面存储和管理。
  • 所以您是在建议这项服务在每个页面上而不是在布局步骤中完成它的工作?
  • 是的,Blazor 设计了几次传球。在 SO 上已经有很多关于它的问题,答案解释了为什么这是一个好主意,以及如果你愿意如何更改设置。
  • @Eugene 服务会自行完成这项工作,无论它是否被页面调用。单例服务将在创建其实例时完成其工作。另一种选择是创建一个配置源,将用户设置加载并存储到本地存储。您也不会尝试在 MVC 的布局页面中加载用户设置。
  • @PanagiotisKanavos 数据可以改变,它不是恒定的。

标签: c# blazor .net-5 blazor-webassembly


【解决方案1】:

如果您想保持相同的方法,那么您可以尝试使用 bool 来确定何时在布局中呈现 @body 标记。

例如:

@if(_isInitComplete)
{
    @body
}


@code {
    private bool _isInitComplete = false;

    protected override async OnInitializedAnsyc()
    {
       // Do stuff
       _isInitComplete = true;
    }
}

【讨论】:

  • 它似乎在没有明显性能损失的情况下工作,我会更好地对这种方法进行基准测试
【解决方案2】:

最后我发现最好的地方是在身份验证这一步,在那里我可以接收到这些额外的数据,将其保存到localStorage,然后可以安全地在每个授权页面上获取。

【讨论】:

    猜你喜欢
    • 2021-06-09
    • 2020-10-23
    • 1970-01-01
    • 2017-11-02
    • 1970-01-01
    • 2021-02-26
    • 2011-08-09
    • 2016-10-03
    • 2020-09-02
    相关资源
    最近更新 更多