Blazor'da Durum Yönetimi
Bileşenler genelinde kullanıcı arayüzünü tutarlı tutmak için paylaşılan durumu hizmet singleton'ları, Fluxor veya kademeli AppState ile yönetin.
Blazor'da Durum Yönetimi, CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C# Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C# Academy kursu toplamda 4 dersten oluşur.
Blazor'da Durum Yönetiminin Zorlukları
Blazor uygulamaları büyüdükçe, birbiriyle ilgisiz birçok bileşen arasında paylaşılması gereken durumu yönetmek karmaşıklaşır. Basit özellik aktarımı yetersiz kalır; merkezi ve tepkisel bir durum deposuna ihtiyaç duyarsınız.
Kapsamlı Hizmetle Basit Durum Yönetimi
Blazor'daki en basit durum yönetimi yaklaşımı, durumu tutan ve bileşenlerin değişikliklere abone olabilmesi için bir olay sunan kapsamlı bir hizmet kullanmaktır.
public class CartState
{
private readonly List<CartItem> _items = new();
public IReadOnlyList<CartItem> Items => _items;
public int Count => _items.Sum(i => i.Quantity);
public event Action? OnChanged;
public void Add(Product p)
{
var existing = _items.FirstOrDefault(i => i.ProductId == p.Id);
if (existing is not null) existing.Quantity++;
else _items.Add(new CartItem { ProductId = p.Id, Name = p.Name, Price = p.Price });
OnChanged?.Invoke();
}
}Durum Değişikliklerine Abone Olma
Bileşenler durum hizmetinin OnChanged olayına abone olur ve yeniden oluşturma işlemini tetiklemek için StateHasChanged çağrısını yapar. Dispose içinde abonelikten ayrılmayı unutmayın.
@inject CartState Cart
@implements IDisposable
<p>Cart: @Cart.Count items</p>
@code {
protected override void OnInitialized()
{
Cart.OnChanged += OnCartChanged;
}
private void OnCartChanged()
{
InvokeAsync(StateHasChanged);
}
public void Dispose() =>
Cart.OnChanged -= OnCartChanged;
}Durum Kapsayıcısı Olarak CascadingValue
Kök yerleşiminizi durum hizmetinizle birlikte bir CascadingValue içine sarmalayın. Tüm alt bileşenler, özellikleri açıkça zincirleme aktarmadan bu hizmete erişebilir.
@* MainLayout.razor *@
@inject CartState Cart
<CascadingValue Value="Cart">
@Body
</CascadingValue>
@* Any nested component: *@
@code {
[CascadingParameter]
public CartState Cart { get; set; } = default!;
private void Buy(Product p) => Cart.Add(p);
}Fluxor: Blazor için Flux Kalıbı
Fluxor, Redux tarzı tek yönlü veri akışını Blazor'a getirir: Durum → Bileşen → Eylem → Reducer → Durum. Karmaşık uygulamalar için oldukça uygundur.
// dotnet add package Fluxor.Blazor.Web
// State record
[FeatureState]
public record CounterState(int Count = 0);
// Actions
public record IncrementAction(int Amount = 1);
// Reducers
public static class CounterReducers
{
[ReducerMethod]
public static CounterState Reduce(CounterState state, IncrementAction action)
=> state with { Count = state.Count + action.Amount };
}
// Registration:
builder.Services.AddFluxor(opt =>
opt.ScanAssemblies(typeof(Program).Assembly));Bir Bileşende Fluxor Kullanma
Durumu okumak için IState<T>, eylemleri göndermek için IDispatcher enjekte edin. InheritsFrom<FluxorComponent> (veya mixin) durum değişikliklerine otomatik olarak abone olur.
@inherits FluxorComponent
@inject IState<CounterState> CounterState
@inject IDispatcher Dispatcher
<p>Count: @CounterState.Value.Count</p>
<button @onclick="Increment">+1</button>
<button @onclick="() => Dispatcher.Dispatch(new IncrementAction(5))">+5</button>
@code {
private void Increment()
=> Dispatcher.Dispatch(new IncrementAction(1));
}LocalStorage ile Kalıcılık
JavaScript birlikte çalışabilirliği aracılığıyla tarayıcının localStorage alanını kullanarak durumu sayfa yenilemeleri arasında koruyun. Uygulama başlatılırken bu durumu geri yükleyin.
@inject IJSRuntime JS
@code {
private async Task SaveStateAsync()
{
var json = JsonSerializer.Serialize(_state);
await JS.InvokeVoidAsync("localStorage.setItem", "appState", json);
}
protected override async Task OnInitializedAsync()
{
var json = await JS.InvokeAsync<string?>("localStorage.getItem", "appState");
if (json is not null)
_state = JsonSerializer.Deserialize<AppState>(json) ?? new();
}
private AppState _state = new();
}Blazored.LocalStorage Paketi
Blazored.LocalStorage paketi, JavaScript birlikte çalışabilirliği çağrılarını elle yazmadan tarayıcının localStorage alanı üzerinde temiz ve tür güvenli bir API sunar.
// dotnet add package Blazored.LocalStorage
builder.Services.AddBlazoredLocalStorage();
@inject ILocalStorageService LocalStorage
@code {
protected override async Task OnInitializedAsync()
{
_cart = await LocalStorage.GetItemAsync<List<CartItem>>("cart") ?? new();
}
private async Task SaveCartAsync()
{
await LocalStorage.SetItemAsync("cart", _cart);
}
private List<CartItem> _cart = new();
}NavigationManager ile URL Durumu
Sayfa yenilense bile korunması ve yer imi olarak kaydedilebilmesi gereken durumu tutmak için sorgu parametrelerini kullanın. Bunları NavigationManager ve URI oluşturucu aracılığıyla okuyup yazın.
@inject NavigationManager Nav
@page "/products"
@code {
[SupplyParameterFromQuery] public string? Search { get; set; }
[SupplyParameterFromQuery] public int Page { get; set; } = 1;
private void UpdateSearch(string s)
{
Nav.NavigateTo(
Nav.GetUriWithQueryParameters(
new Dictionary<string, object?>
{
[nameof(Search)] = s,
[nameof(Page)] = 1
}));
}
}Gerçek Hayattan: Alışveriş Sepeti Durumu
Tam bir kalıp: olaylara sahip kapsamlı CartState hizmeti, değişiklik olduğunda localStorage alanına kaydedilir ve yükleme sırasında geri yüklenir.
public class CartState
{
private readonly ILocalStorageService _storage;
private List<CartItem> _items = new();
public event Action? OnChanged;
public CartState(ILocalStorageService storage) => _storage = storage;
public async Task InitAsync()
{
_items = await _storage.GetItemAsync<List<CartItem>>("cart") ?? new();
}
public async Task AddAsync(Product p)
{
var item = _items.FirstOrDefault(i => i.ProductId == p.Id);
if (item is not null) item.Quantity++;
else _items.Add(new CartItem { ProductId = p.Id, Name = p.Name });
await _storage.SetItemAsync("cart", _items);
OnChanged?.Invoke();
}
}Hızlı Kontrol
Paylaşılan durumu sınırlı olan basit bir Blazor uygulaması için hangi durum yönetimi yaklaşımı en uygundur?
Özet: Blazor'da Durum Yönetimi
Temel çıkarımlar:
- Kapsamlı hizmet + Action olayı: en basit paylaşılan durum yaklaşımı; çoğu uygulama için uygundur
- Kök bileşeni saran CascadingValue, özellikleri zincirleme aktarmadan uygulama genelinde erişim sağlar
- Fluxor: karmaşık durum mantığı için Redux tarzı tek yönlü akış
- IJSRuntime veya Blazored.LocalStorage ile durumu localStorage alanında kalıcı hâle getirin
- URL durumu (SupplyParameterFromQuery), yer imi olarak kaydedilebilen ve paylaşılabilen kullanıcı arayüzü durumu sağlar
- Bellek sızıntılarını önlemek için olay aboneliklerinden her zaman Dispose içinde ayrılın
Sıkça Sorulan Sorular
“Blazor'da Durum Yönetimi” dersi ücretsiz mi?
Evet — “Blazor'da Durum Yönetimi” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C# Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C# Academy kursu toplamda 4 dersten oluşur.
“Blazor'da Durum Yönetimi” dersinde ne öğreneceğim?
Bileşenler genelinde kullanıcı arayüzünü tutarlı tutmak için paylaşılan durumu hizmet singleton'ları, Fluxor veya kademeli AppState ile yönetin. C# Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
C# Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te C# Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“Blazor'da Durum Yönetimi” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu C# Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her C# Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Blazor Bileşen Modeli
- Veri Bağlama ve Olay İşleme
- Bileşenler Arası İletişim ve DI
- Blazor'da Durum Yönetimi