是什麼原因導致if / else表達式被重新評估?

asp.net-core blazor c#

使用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中的“登錄面板”發生變化。如果所有內容都在一個文件中,並且我只檢查特定變量是否為null(參見此處 ),那麼我能夠使其工作,所以我假設Blazor框架具有特定的標準,這些標準會使頁面無法恢復評估這樣的塊。這準確嗎?如果是這樣,強制進行重新評估的最佳方法是什麼?

編輯:我玩了一下,最終發現了StateHasChanged受保護的成員函數,我假設在Init完成後調用,因此上一個示例的工作原理。我認為一個有效的解決方案是讓我的UserInfo對象實現INotifyPropertyChanged ,然後在MainLayout.cshtml中註冊一個更改處理程序,以便為登錄狀態更改時需要更新的視圖調用StateHasChanged()

一般承認的答案

是。 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



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因