0Pricing
C# Academy · บทเรียน

รูปแบบคอมโพเนนต์ของ Blazor

สร้างคอมโพเนนต์ Razor ทำความเข้าใจวงจรชีวิตของคอมโพเนนต์ และใช้พารามิเตอร์กับค่าที่ส่งต่อแบบลำดับชั้น

รูปแบบคอมโพเนนต์ของ Blazor เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C# Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน

Blazor คืออะไร

Blazor ช่วยให้คุณสร้างส่วนติดต่อผู้ใช้เว็บแบบโต้ตอบได้โดยใช้ C# แทน JavaScript คอมโพเนนต์จะกำหนดไว้ในไฟล์ .razor ซึ่งรวมมาร์กอัป HTML และตรรกะ C# เข้าด้วยกัน Blazor ทำงานบนเซิร์ฟเวอร์ (Blazor Server) หรือในเบราว์เซอร์ผ่าน WebAssembly (Blazor WASM)

คอมโพเนนต์แรกของคุณ

คอมโพเนนต์ Razor คือไฟล์ .razor ที่มีมาร์กอัป HTML และบล็อก @code สำหรับ C# ชื่อคอมโพเนนต์จะกลายเป็นชื่อแท็ก HTML

@* Greeting.razor *@
<h2>Hello, @Name!</h2>
<p>You have @Count messages.</p>

@code {
    [Parameter] public string Name { get; set; } = "World";
    private int Count = 5;
}

วงจรชีวิตของคอมโพเนนต์

คอมโพเนนต์ Blazor มีวงจรชีวิตพร้อมฮุกที่คุณสามารถเขียนทับได้ ฮุกที่ใช้บ่อยที่สุดคือ OnInitializedAsync (การโหลดข้อมูล) และ OnParametersSetAsync (การตอบสนองต่อการเปลี่ยนแปลงของพารามิเตอร์)

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

    protected override async Task OnInitializedAsync()
    {
        // Called once on first render
        Products = await Http.GetFromJsonAsync<List<Product>>("/api/products")
                   ?? new();
    }

    protected override async Task OnParametersSetAsync()
    {
        // Called whenever parameters change
        await LoadDataAsync();
    }
}

พารามิเตอร์: การส่งข้อมูลไปยังคอมโพเนนต์

กำกับพร็อพเพอร์ตีด้วย [Parameter] เพื่อรับข้อมูลจากคอมโพเนนต์แม่ ระบบจะกำหนดค่าพารามิเตอร์ก่อนการเรนเดอร์ และการเปลี่ยนแปลงอาจทำให้เกิดการเรนเดอร์ใหม่

@* ProductCard.razor *@
<div class="card">
    <h4>@Product.Name</h4>
    <p>Price: @Product.Price.ToString("C")</p>
    <button @onclick="AddToCart">Add to Cart</button>
</div>

@code {
    [Parameter, EditorRequired]
    public Product Product { get; set; } = default!;

    [Parameter]
    public EventCallback<Product> OnAddToCart { get; set; }

    private async Task AddToCart() =>
        await OnAddToCart.InvokeAsync(Product);
}

พารามิเตอร์แบบส่งต่อ

พารามิเตอร์แบบส่งต่อจะไหลลงมาตามลำดับชั้นของคอมโพเนนต์โดยไม่ต้องส่งผ่านแต่ละระดับกลางอย่างชัดเจน — เหมาะสำหรับธีม ข้อมูลผู้ใช้ หรือสถานะที่ใช้ร่วมกัน

@* App.razor — wraps the whole app *@
<CascadingValue Value="CurrentUser">
    <Router AppAssembly="@typeof(App).Assembly">
        <Found Context="routeData">
            <RouteView RouteData="routeData" DefaultLayout="@typeof(MainLayout)" />
        </Found>
    </Router>
</CascadingValue>

@* Anywhere in the tree: *@
@code {
    [CascadingParameter]
    public UserInfo CurrentUser { get; set; } = default!;
}

การเรนเดอร์รายการและเงื่อนไข

ใช้คำสั่ง Razor @if, @foreach และ @for เพื่อเรนเดอร์เนื้อหาแบบไดนามิก ควรกำหนด @key ให้รายการในลิสต์เสมอเพื่อให้การเปรียบเทียบความแตกต่างมีประสิทธิภาพ

@if (Products.Count == 0)
{
    <p>No products found.</p>
}
else
{
    <ul>
        @foreach (var product in Products)
        {
            <li @key="product.Id">
                <ProductCard Product="product" OnAddToCart="HandleAdd" />
            </li>
        }
    </ul>
}

RenderFragment และ ChildContent

ใช้ RenderFragment เพื่อส่งมาร์กอัปเป็นพารามิเตอร์ เช่น สล็อตใน Vue หรือองค์ประกอบลูกใน React ชื่อพารามิเตอร์ตามธรรมเนียมคือ ChildContent

@* Panel.razor *@
<div class="panel">
    <div class="panel-header">@Title</div>
    <div class="panel-body">@ChildContent</div>
</div>

@code {
    [Parameter] public string Title { get; set; } = "";
    [Parameter] public RenderFragment? ChildContent { get; set; }
}

@* Usage: *@
<Panel Title="Order Details">
    <p>Order #42 — Shipped</p>
</Panel>

การอ้างอิงคอมโพเนนต์ด้วย @ref

บันทึกการอ้างอิงไปยังคอมโพเนนต์ลูกด้วย @ref เพื่อเรียกใช้เมธอดสาธารณะหรืออ่านพร็อพเพอร์ตีของคอมโพเนนต์นั้นจากคอมโพเนนต์แม่

@* Parent.razor *@
<ConfirmDialog @ref="_dialog" OnConfirm="DeleteOrder" />
<button @onclick="() => _dialog!.Show()">Delete Order</button>

@code {
    private ConfirmDialog? _dialog;

    private async Task DeleteOrder()
    {
        await OrderService.DeleteAsync(CurrentOrderId);
        // Refresh UI...
    }
}

StateHasChanged และการเรนเดอร์ใหม่ด้วยตนเอง

Blazor จะเรนเดอร์ใหม่โดยอัตโนมัติหลังตัวจัดการอีเวนต์ทำงาน สำหรับการเปลี่ยนแปลงสถานะแบบอะซิงโครนัสที่เกิดขึ้นภายนอกตัวจัดการอีเวนต์ (เช่น จากตัวจับเวลาเบื้องหลัง) ให้เรียกใช้ StateHasChanged() ด้วยตนเอง

@implements IDisposable

<p>Time: @CurrentTime</p>

@code {
    private string CurrentTime = "";
    private Timer? _timer;

    protected override void OnInitialized()
    {
        _timer = new Timer(_ =>
        {
            CurrentTime = DateTime.Now.ToString("HH:mm:ss");
            InvokeAsync(StateHasChanged); // thread-safe re-render
        }, null, 0, 1000);
    }

    public void Dispose() => _timer?.Dispose();
}

ShouldRender เพื่อประสิทธิภาพ

เขียนทับ ShouldRender() เพื่อข้ามการเรนเดอร์ใหม่ที่ไม่จำเป็น ให้ส่งคืนค่า false เมื่อผลลัพธ์ของคอมโพเนนต์จะไม่เปลี่ยนแปลง ซึ่งช่วยลดภาระในการเปรียบเทียบความแตกต่าง

@code {
    private string _lastRenderedStatus = "";

    [Parameter] public string Status { get; set; } = "";

    protected override bool ShouldRender()
    {
        // Only re-render if Status actually changed
        if (Status == _lastRenderedStatus) return false;
        _lastRenderedStatus = Status;
        return true;
    }
}

การใช้งานจริง: คอมโพเนนต์แสดงรายการสินค้า

คอมโพเนนต์แสดงรายการสินค้าที่สมบูรณ์ ซึ่งโหลดข้อมูลเมื่อเริ่มต้น จัดการสถานะกำลังโหลด และส่งอีเวนต์ไปยังคอมโพเนนต์แม่

@inject HttpClient Http

@if (_loading)
{
    <p>Loading products...</p>
}
else
{
    @foreach (var p in _products)
    {
        <ProductCard Product="p" OnAddToCart="AddToCart" />
    }
}

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

    [Parameter] public EventCallback<Product> OnCartUpdated { get; set; }

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

    private async Task AddToCart(Product p) => await OnCartUpdated.InvokeAsync(p);
}

ตรวจสอบความเข้าใจ

เมธอดใดในวงจรชีวิตเหมาะที่สุดสำหรับโหลดข้อมูลจาก API เมื่อคอมโพเนนต์ Blazor เริ่มต้น

ทบทวน: รูปแบบคอมโพเนนต์ของ Blazor

ประเด็นสำคัญ:

  • ไฟล์ .razor ผสมมาร์กอัป HTML กับ C# ภายในบล็อก @code
  • [Parameter] รับข้อมูลจากคอมโพเนนต์แม่ ส่วน EventCallback ส่งอีเวนต์ขึ้นไป
  • CascadingParameter ส่งข้อมูลลงมาโดยไม่ต้องส่งพร็อปผ่านทุกระดับ
  • RenderFragment/ChildContent สร้างคอมโพเนนต์แบบสล็อตที่นำมาประกอบใช้ซ้ำได้
  • ใช้ OnInitializedAsync เพื่อโหลดข้อมูลเริ่มต้น และ StateHasChanged เพื่อเรนเดอร์ใหม่ด้วยตนเอง
  • ShouldRender() ข้ามการเปรียบเทียบความแตกต่างที่ไม่จำเป็นเพื่อประสิทธิภาพ

คำถามที่พบบ่อย

บทเรียน “รูปแบบคอมโพเนนต์ของ Blazor” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “รูปแบบคอมโพเนนต์ของ Blazor” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C# Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “รูปแบบคอมโพเนนต์ของ Blazor”

สร้างคอมโพเนนต์ Razor ทำความเข้าใจวงจรชีวิตของคอมโพเนนต์ และใช้พารามิเตอร์กับค่าที่ส่งต่อแบบลำดับชั้น คุณปฏิบัติ C# Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C# Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C# Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “รูปแบบคอมโพเนนต์ของ Blazor” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C# Academy นี้ได้ไหม

ได้ บทเรียน C# Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. รูปแบบคอมโพเนนต์ของ Blazor
  2. การผูกข้อมูลและการจัดการเหตุการณ์
  3. การสื่อสารระหว่างคอมโพเนนต์และ DI
  4. การจัดการสถานะใน Blazor
← กลับไปที่ C# Academy