嘗試使用 AppState 類傳遞變數時,組件會在呼叫發生在同一組件中時更新,但在父級觸發事件時不會在子組件中更新。
家長
@code {
[Parameter]
public int Id { get; set; }
WikiDetailDto wikiDetail = null;
protected async override Task OnInitializedAsync()
{
Console.WriteLine("going in detail INIT");
AppState.OnCurrentWikiPageChanged = StateHasChanged;
AppState.SetCurrentWikiPage(await wikiPageService.GetDetail(Id));
wikiDetail = AppState.CurrentWikiPage;
Console.WriteLine("Retrieved WikiDetail!");
}
}
孩子
<MudDrawer Anchor="Anchor.End" Open="true">
<MudDrawerHeader>Recommendations</MudDrawerHeader>
@if(AppState.CurrentWikiPage != null)
{
@(RecommendedWikiPages = CalculateReccomendedWikis(AppState.CurrentWikiPage));
if(RecommendedWikiPages != null)
{
foreach(var p in RecommendedWikiPages)
{
<MudCard>
<MudCardContent>
<MudText>@p.Name</MudText>
</MudCardContent>
</MudCard>
}
}
}
else
{
<p>Loading...</p>
}
當 AppState.CurrentWikiPage 更新時,它不會檢查 cild 的 if 陳述句。這里的最佳實踐是什么?我不想使用級聯值。
應用狀態
public WikiDetailDto CurrentWikiPage { get; set; }
public event Action OnCurrentWikiPageChanged;
public void SetCurrentWikiPage(WikiDetailDto wikiPage)
{
CurrentWikiPage = wikiPage;
OnCurrentWikiPageChanged?.Invoke();
}
uj5u.com熱心網友回復:
如果我正確閱讀了您的代碼,則子組件需要注冊該OnCurrentWikiPageChanged事件。
你的孩子需要看起來像這樣:
@implements IDisposable
..... markup code
protected async override Task OnInitializedAsync()
{
AppState.OnCurrentWikiPageChanged = StateHasChanged;
}
public void Dispose()
{
AppState.OnCurrentWikiPageChanged -= StateHasChanged;
}
我個人不會StateHasChanged直接鏈接到事件處理程式。這是不好的做法,因為StateHasChanged必須運行 UI 背景關系執行緒。如果事件呼叫者正在另一個執行緒上運行,您將收到例外。我會堅持一個標準EventHandler。WASM 現在可能是單執行緒的,但可能不是永遠的。
我的處理程式看起來像:
private void OnxxxChanged(object sender, EventArgs e)
=> this.InvokeAsync(StateHasChanged);
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/360977.html
