Blazor 구성 요소 모델
Razor 구성 요소를 만들고 구성 요소 수명 주기를 이해하며 매개 변수와 계단식 값을 사용합니다.
Blazor 구성 요소 모델은(는) CoddyKit의 무료 C# Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C# Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
Blazor란 무엇인가요
Blazor를 사용하면 JavaScript 대신 C#으로 대화형 웹 사용자 인터페이스를 구축할 수 있습니다. 구성 요소는 HTML 마크업과 C# 로직을 결합한 .razor 파일에 정의합니다. Blazor는 서버(Blazor Server)에서 실행되거나 WebAssembly를 통해 브라우저에서 실행됩니다(Blazor WASM).
첫 번째 구성 요소
Razor 구성 요소는 HTML 마크업과 C#을 위한 @code 블록이 포함된 .razor 파일입니다. 구성 요소 이름이 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는 이벤트 처리기 실행 후 자동으로 다시 렌더링합니다. 이벤트 처리기 외부에서 발생하는 async 상태 변경(예: 백그라운드 타이머에 의한 변경)의 경우 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);
}빠른 확인
Blazor 구성 요소가 초기화될 때 API에서 데이터를 로드하기에 가장 적합한 수명 주기 메서드는 무엇입니까?
요약: Blazor 구성 요소 모델
핵심 내용:
- .razor 파일은 HTML 마크업과 @code 블록의 C#을 함께 사용합니다
- [Parameter]는 부모의 데이터를 받고 EventCallback은 이벤트를 상위로 전달합니다
- CascadingParameter는 속성을 반복해서 전달하지 않아도 데이터를 아래로 전달합니다
- RenderFragment/ChildContent는 조합 가능한 슬롯 기반 구성 요소를 만듭니다
- 초기 데이터 로드에는 OnInitializedAsync를 사용하고 수동 다시 렌더링에는 StateHasChanged를 사용합니다
- ShouldRender()는 성능을 위해 불필요한 차이 계산을 건너뜁니다
자주 묻는 질문
“Blazor 구성 요소 모델” 강의는 무료인가요?
네 — “Blazor 구성 요소 모델” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C# Academy 강의 전체를 잠금 해제할 수 있습니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“Blazor 구성 요소 모델”에서 뭘 배우나요?
Razor 구성 요소를 만들고 구성 요소 수명 주기를 이해하며 매개 변수와 계단식 값을 사용합니다. 브라우저에서 직접 실행하는 실습 코드로 C# Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
C# Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 C# Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.
“Blazor 구성 요소 모델” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 C# Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 C# Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- Blazor 구성 요소 모델
- 데이터 바인딩과 이벤트 처리
- 구성 요소 통신과 DI
- Blazor의 상태 관리