是啥导致重新评估 if/else 表达式?

Posted

技术标签:

【中文标题】是啥导致重新评估 if/else 表达式?【英文标题】:What causes if/else expressions to be re-evaluated?是什么导致重新评估 if/else 表达式? 【发布时间】:2018-09-17 17:12:04 【问题描述】:

使用 Blazor 托管模板,在我的 MainLayout.cshtml 中,我有类似的内容:

@inject UserInfo userInfo
@if(userInfo.Name == "bob")

    <div class="login-panel">
        <p>Hi Bob!</p>
    </div>

else

    <LoginPanel />

然后在单独的Login.cshtml中:

@inject UserInfo userInfo
async void Login()

    userInfo.Name = "bob";

但登录不会导致 MainLayout.cshtml 中的“登录面板”发生变化。如果所有内容都在一个文件中,并且我只检查特定变量是否为空(请参阅here),我就能够让它工作,所以我假设 Blazor 框架具有特定的标准,这些标准会非法页面重新评估这些块。这是准确的吗?如果是这样,强制重新评估的最佳方法是什么?

编辑:我又玩了一会儿,最终发现了 StateHasChanged 受保护的成员函数,我假设它在 Init 完成后被调用,因此前面的示例有效。我认为一个可行的解决方案是让我的UserInfo 对象实现INotifyPropertyChanged,然后在 MainLayout.cshtml 中注册一个更改处理程序以调用StateHasChanged() 以获取在登录状态更改时需要更新的视图。

【问题讨论】:

【参考方案1】:

是的。 Blazor 使用名为 StateHasChanged 的东西,就像 INotifyPropertyChanged

但不同之处在于,在 XAML 框架中,XAML更新那些已调用 INotifyPropertyChanged 的属性,但在 Razor 中,当StateHasChanged 被称为 UI 框架将刷新元素所在的组件的整个 UI 树(至少到目前为止)。 如果不是你做的,那么谁打电话给StateHasChanged。当一个元素获得输入(您正在单击一个按钮)时,blazor 将自动设置 StateHasChanged 在引擎盖下。

更多阅读”

https://github.com/aspnet/Blazor/issues/409

https://learn-blazor.com/pages/data-binding/

https://github.com/aspnet/Blazor/issues/359

https://github.com/aspnet/Blazor/issues/407

【讨论】:

以上是关于是啥导致重新评估 if/else 表达式?的主要内容,如果未能解决你的问题,请参考以下文章

VBA if...else语句

R语言 决策

C# 判断

Angular ng-if不重新编译指令

java,if else和if else if else区别?

JAVA条件语句之if...else