Blazor WASM - 레이아웃과 페이지 간의 공유 상태
10232 단어 blazoraspnetdotnetwebassembly
데이터가 포함된 클래스를 만듭니다.
using System.Collections.ObjectModel;
public class NamesService{
private readonly List<string> _names = new List<string>();
public ReadOnlyCollection<string> Names {
get { return _names.AsReadOnly(); }
}
public event Action? StateChanged;
public void AddName(string name) {
_names.Add(name);
StateChanged?.Invoke(); //raise the event
}
}
이벤트를 사용하고 있습니다. 이 클래스의 종속 항목(blazor 구성 요소)은
StateChanged
이벤트를 구독해야 합니다.데이터를 직접 추가하는 것을 피하기 위해 읽기 전용 컬렉션을 반환하고 있다는 점에 유의하십시오. 종속 항목은 대신
AddName
를 사용하여 이벤트를 트리거해야 합니다.DI에 상태 컨테이너를 Singleton으로 등록합니다. 귀하의
Program.cs
.builder.Services.AddSingleton<NamesService>();
페이지를 전환할 때마다
NamesService
의 새 인스턴스를 만들고 싶지 않기 때문에 싱글톤으로 만듭니다.구성 요소에서
StateChanged
이벤트를 구독합니다. 예를 들어 레이아웃에서:@inherits LayoutComponentBase
@implements IDisposable
@inject NamesService NamesService
<!-- some code goes here -->
<span>@NamesState.Names.Count</span>
<button @onclick="Add">Add</button>
<!-- some code goes here -->
@Body
<!-- some code goes here -->
@code {
protected override void OnInitialized() {
NamesService.StateChanged += this.StateHasChanged; // subscribe
}
protected void Add() {
NamesService.Add("from layout: " + DateTime.UtcNow.ToString()); // add random data
}
public void Dispose() {
NamesService.StateChanged -= this.StateHasChanged; // unsubscribe
}
}
참고 사항:
NamesService
인스턴스를 가져옵니다. OnInitialized
) 구성 요소의 NamesService.StateChanged
메서드를 사용하여 StateHasChanged
를 구독합니다. IDisposable
에서 구독을 취소할 수 있도록 NamesService.StateChanged
를 구현합니다. 우리 페이지에서는 동일합니다.
@page "/test"
@implements IDisposable
@inject NamesService NamesService
<ul>@foreach(var name in NamesState.Names)
{ <li>@name</li> }
</ul>
<button @onclick="Add">Add</button>
@code {
protected override void OnInitialized() {
NamesService.StateChanged += this.StateHasChanged; // subscribe
}
protected void Add() {
NamesService.Add("from page: " + DateTime.UtcNow.ToString()); // add random data
}
public void Dispose() {
NamesService.StateChanged -= this.StateHasChanged; // unsubscribe
}
}
요약하면
NamesService.Add()
가 호출되면 이벤트 NamesService.StateChanged
가 발생하고 이벤트의 모든 구독자에게 알림이 전송되며 이 예에서는 구성 요소의 StateHasChanged
가 호출됩니다.우리의 구성 요소는 이제 데이터를 추가할 수 있으며 변경 사항은 모든 구독 구성 요소에 반영되어야 합니다.
자원
Microsoft Docs - Event
Microsoft Docs - Service Lifetime
Microsoft Docs - StateHasChanged
Microsoft Docs - State Management
Reference
이 문제에 관하여(Blazor WASM - 레이아웃과 페이지 간의 공유 상태), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/kazinix/blazor-wasm-shared-state-between-layout-and-page-1po5텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)