0Pricing
C# Academy · Pelajaran

Komunikasi Komponen & DI

Teruskan data antara komponen induk dan anak, gunakan parameter berjenjang, dan injeksikan layanan ke dalam komponen.

Komunikasi Komponen & DI adalah pelajaran C# Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C# Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C# Academy mencakup 4 pelajaran total.

Pola Komunikasi Komponen

Komponen Blazor berkomunikasi melalui tiga arah: induk ke anak (Parameters), anak ke induk (EventCallback), dan melintasi pohon (CascadingParameters atau layanan bersama melalui DI).

Induk ke Anak: Parameters

Anotasi properti komponen dengan [Parameter] agar nilainya dapat diatur dari komponen induk. Komponen induk meneruskan nilai sebagai atribut HTML pada tag komponen.

@* Child: Alert.razor *@
<div class="alert alert-@Type">
    @Message
</div>

@code {
    [Parameter] public string Type { get; set; } = "info"; // primary, warning, danger
    [Parameter, EditorRequired] public string Message { get; set; } = "";
}

@* Parent usage: *@
<Alert Type="danger" Message="Something went wrong!" />
<Alert Message="Record saved." />

Anak ke Induk: EventCallback

Komponen anak menyediakan parameter EventCallback. Komponen induk menyediakan metode penanganan. Komponen anak memanggilnya ketika terjadi sesuatu.

@* Child: QuantityPicker.razor *@
<button @onclick="() => OnChanged.InvokeAsync(Value - 1)">-</button>
<span>@Value</span>
<button @onclick="() => OnChanged.InvokeAsync(Value + 1)">+</button>

@code {
    [Parameter] public int Value { get; set; } = 1;
    [Parameter] public EventCallback<int> OnChanged { get; set; }
}

@* Parent: *@
<QuantityPicker Value="@_qty" OnChanged="q => _qty = q" />
<p>Quantity: @_qty</p>

Komunikasi Antarsaudara melalui Induk

Agar komponen bersaudara dapat berkomunikasi, teruskan data melalui komponen induk bersama. Komponen induk menyimpan state bersama dan meneruskannya kepada komponen anak sebagai parameter.

@* Parent holds shared state *@
<CategoryFilter OnChanged="c => _category = c" />
<ProductList Category="_category" />

@code {
    private string _category = "All";
}

@* CategoryFilter raises an event -> Parent updates _category
   -> ProductList re-renders with new Category *@

Parameter Berjenjang

Bungkus subtree dengan <CascadingValue> untuk meneruskan data kepada semua turunannya tanpa meneruskannya melalui setiap komponen perantara.

@* Wrap a subtree *@
<CascadingValue Value="_theme">
    <MainLayout />
</CascadingValue>

@code { private Theme _theme = new Theme { PrimaryColor = "#6366f1" }; }

@* Any descendant can receive it: *@
@code {
    [CascadingParameter]
    public Theme AppTheme { get; set; } = default!;
}

<h1 style="color: @AppTheme.PrimaryColor">Hello</h1>

Menyuntikkan Layanan dengan @inject

Gunakan direktif @inject untuk menyuntikkan layanan DI yang telah didaftarkan secara langsung ke dalam komponen. Layanan tersebut secara otomatis ditemukan oleh framework.

@inject IProductService ProductSvc
@inject ILogger<ProductList> Logger
@inject NavigationManager Nav

@code {
    private List<Product> _products = new();

    protected override async Task OnInitializedAsync()
    {
        Logger.LogInformation("Loading products");
        _products = await ProductSvc.GetAllAsync();
    }

    private void GoToProduct(int id)
        => Nav.NavigateTo($"/products/{id}");
}

Layanan Berscope di Blazor Server

Di Blazor Server, scope DI berlangsung selama seluruh masa koneksi SignalR — bukan hanya selama satu permintaan. Perlu diketahui bahwa layanan berscope digunakan bersama oleh semua komponen dalam satu sirkuit.

// Blazor Server: scoped = per circuit (connection lifetime)
builder.Services.AddScoped<CartService>();
// All components in the same browser tab share the SAME CartService

// This is GOOD for cart state (user's items persist across pages)
// This is BAD for request-scoped data — treat as session-like scope

// For true per-render-cycle scope, create your own:
using var scope = ScopeFactory.CreateScope();
var db = scope.ServiceProvider.GetRequiredService<AppDbContext>();

NavigationManager untuk Routing

Suntikkan NavigationManager untuk melakukan navigasi secara terprogram, membaca URL saat ini, dan menangani peristiwa navigasi.

@inject NavigationManager Nav

@code {
    private void GoHome()         => Nav.NavigateTo("/");
    private void GoToProduct(int id) => Nav.NavigateTo($"/products/{id}");
    private void ForceReload()    => Nav.NavigateTo("/", forceLoad: true);

    protected override void OnInitialized()
    {
        // Read current URL
        var uri = Nav.Uri;
        var path = new Uri(uri).AbsolutePath;
    }
}

HttpClient di Blazor WASM

Di Blazor WebAssembly, suntikkan HttpClient yang telah dikonfigurasi sebelumnya untuk memanggil API Anda. Daftarkan dengan alamat dasar di Program.cs.

// Program.cs (Blazor WASM)
builder.Services.AddScoped(sp => new HttpClient
{
    BaseAddress = new Uri(builder.HostEnvironment.BaseAddress)
});

// Component:
@inject HttpClient Http

@code {
    private List<Product> _products = new();

    protected override async Task OnInitializedAsync()
    {
        _products = await Http.GetFromJsonAsync<List<Product>>("/api/products")
                   ?? new();
    }
}

Dunia Nyata: Layanan Konteks Pengguna

UserContextService berscope disuntikkan ke beberapa komponen di seluruh aplikasi — setiap komponen melihat data pengguna yang sama tanpa meneruskan properti secara berantai.

public class UserContextService
{
    public string? Name { get; private set; }
    public bool IsAdmin { get; private set; }

    public async Task InitializeAsync(AuthenticationState auth)
    {
        var user = auth.User;
        Name = user.Identity?.Name;
        IsAdmin = user.IsInRole("Admin");
    }
}

// Registered as scoped:
builder.Services.AddScoped<UserContextService>();

// Used in any component:
@inject UserContextService UserCtx
<p>Hello, @UserCtx.Name @(UserCtx.IsAdmin ? "(Admin)" : "")</p>

Pemeriksaan Singkat

Di Blazor Server, berapa lama masa berlaku layanan DI yang berscope?

Ringkasan: Komunikasi Komponen &amp; DI

Inti pembelajaran:

  • Induk → Anak: properti [Parameter]; [EditorRequired] untuk parameter wajib
  • Anak → Induk: EventCallback; secara otomatis memicu StateHasChanged pada induk
  • Komponen bersaudara: teruskan melalui state induk atau gunakan layanan DI bersama
  • Melintasi pohon: CascadingValue/CascadingParameter untuk subtree yang dalam
  • @inject untuk layanan; layanan berscope Blazor Server bertahan selama masa berlaku sirkuit
  • NavigationManager untuk routing terprogram

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Komunikasi Komponen & DI” gratis?

Ya — teks lengkap “Komunikasi Komponen & DI” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C# Academy, upgrade ke CoddyKit PRO. Kursus C# Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Komunikasi Komponen & DI”?

Teruskan data antara komponen induk dan anak, gunakan parameter berjenjang, dan injeksikan layanan ke dalam komponen. Kamu berlatih C# Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai C# Academy?

Tidak diperlukan pengalaman sebelumnya. C# Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.

Berapa lama pelajaran “Komunikasi Komponen & DI” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran C# Academy ini?

Ya. Setiap pelajaran C# Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Model Komponen Blazor
  2. Pengikatan Data & Penanganan Peristiwa
  3. Komunikasi Komponen & DI
  4. Pengelolaan Status di Blazor
← Kembali ke C# Academy