Akademi C# · Pelajaran

Pengurusan Keadaan dalam Blazor

Urus keadaan dikongsi dengan singleton perkhidmatan, Fluxor atau AppState berlatarkan untuk mengekalkan konsistensi UI merentas komponen.

Pelajaran 4 daripada 412 langkah

Pengurusan Keadaan dalam Blazor ialah pelajaran Akademi C# percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Akademi C#, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Akademi C# merangkumi sejumlah 4 pelajaran.

Cabaran Pengurusan Keadaan dalam Blazor

Apabila aplikasi Blazor semakin besar, pengurusan keadaan yang perlu dikongsi oleh banyak komponen yang tidak berkaitan menjadi rumit. Penerusan parameter melalui setiap komponen tidak lagi memadai; anda memerlukan stor keadaan berpusat dan reaktif.

Keadaan Ringkas dengan Perkhidmatan scope

Pengurusan keadaan Blazor yang paling ringkas: perkhidmatan dengan scope yang menyimpan keadaan dan mendedahkan peristiwa supaya komponen boleh melanggan perubahan.

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();
    }
}

Melanggan Perubahan Keadaan

Komponen melanggan peristiwa OnChanged perkhidmatan keadaan dan memanggil StateHasChanged untuk merender semula. Ingat untuk berhenti melanggan dalam Dispose.

@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;
}

CascadingValue sebagai Bekas Keadaan

Bungkus reka letak akar anda dalam CascadingValue bersama perkhidmatan keadaan anda. Semua keturunan boleh mengaksesnya tanpa perlu meneruskan parameter secara eksplisit.

@* 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: Corak Flux untuk Blazor

Fluxor membawa aliran data satu arah ala Redux ke Blazor: Keadaan → Komponen → Tindakan → Reducer → Keadaan. Sesuai untuk aplikasi yang kompleks.

// 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));

Menggunakan Fluxor dalam Komponen

Suntik IState<T> untuk membaca keadaan dan IDispatcher untuk menghantar tindakan. InheritsFrom<FluxorComponent> (atau mixin tersebut) melanggan perubahan keadaan secara automatik.

@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));
}

Kekalan dalam LocalStorage

Kekalkan keadaan merentasi penyegaran halaman menggunakan localStorage pelayar melalui saling kendali JavaScript. Pulihkannya semasa aplikasi dimulakan.

@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();
}

Pakej Blazored.LocalStorage

Pakej Blazored.LocalStorage menyediakan API yang kemas dan ditaip untuk localStorage pelayar tanpa perlu menulis panggilan saling kendali JS secara manual.

// 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();
}

Keadaan URL dengan NavigationManager

Gunakan parameter pertanyaan untuk menyimpan keadaan yang perlu kekal selepas penyegaran halaman dan boleh ditanda buku. Baca dan tuliskannya melalui NavigationManager serta pembina URI.

@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
                }));
    }
}

Dunia Sebenar: Keadaan Troli Beli-belah

Corak lengkap: perkhidmatan CartState dengan scope dan peristiwa, disimpan dalam localStorage apabila berlaku perubahan, kemudian dipulihkan semasa pemuatan.

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();
    }
}

Semakan Pantas

Pendekatan pengurusan keadaan manakah yang terbaik untuk aplikasi Blazor ringkas dengan keadaan dikongsi yang terhad?

Imbas Kembali: Pengurusan Keadaan dalam Blazor

Inti pati utama:

  • Perkhidmatan dengan scope + peristiwa tindakan: keadaan dikongsi yang paling ringkas dan sesuai untuk kebanyakan aplikasi
  • CascadingValue yang membungkus akar menyediakan capaian seluruh aplikasi tanpa perlu meneruskan parameter melalui setiap komponen
  • Fluxor: aliran satu arah ala Redux untuk logik keadaan yang kompleks
  • Kekalkan keadaan dalam localStorage dengan IJSRuntime atau Blazored.LocalStorage
  • Keadaan URL (SupplyParameterFromQuery) untuk keadaan UI yang boleh ditanda buku dan dikongsi
  • Sentiasa berhenti melanggan peristiwa dalam Dispose untuk mencegah kebocoran memori
Percuma untuk bermula

Pelajari C# dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
93
Pelajaran
346

Soalan Lazim

Adakah pelajaran “Pengurusan Keadaan dalam Blazor” percuma?

Ya — teks penuh “Pengurusan Keadaan dalam Blazor” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Akademi C#, tingkat taraf kepada CoddyKit PRO. Kursus Akademi C# merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Pengurusan Keadaan dalam Blazor”?

Urus keadaan dikongsi dengan singleton perkhidmatan, Fluxor atau AppState berlatarkan untuk mengekalkan konsistensi UI merentas komponen. Anda berlatih Akademi C# menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Akademi C#?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Akademi C# di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.

Berapa lamakah pelajaran “Pengurusan Keadaan dalam Blazor” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Akademi C# ini?

Ya. Setiap pelajaran Akademi C# menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Model Komponen Blazor
  2. Pengikatan Data & Pengendalian Peristiwa
  3. Komunikasi Komponen & DI
  4. Pengurusan Keadaan dalam Blazor
← Kembali ke Akademi C#