동일한 기능을 수행하는 컴포넌트를 다른 페이지에서 재사용하기위해 단순히 전체 스크립트를 복사-붙여넣기 하는 방식이 아닌 컴포넌트로 관리하여 다른 페이지에서 불러오면 되는 방식을 학습하였습니다. 파라미터, 레퍼런스, 콜백이벤트를 다룹니다.
· ShowUser.razor
<!-- 이 컴포넌트는 페이지가 아니라 페이지의 구성요소 중 하나이기에 @page 선언 안함-->
<!-- 스크립트 참조 -->
@using BlazorApp.Data;
<p>
유저 수: <b>@Users.Count()</b>
</p>
<br />
<ul class="list-group">
@foreach (UserData user in Users)
{
<!-- @key="user" li가 사용하는 대상이 user라고 명시적으로 알려주는 속성-->
<li @key="user" class="list-group-item">
<button type="button" class="btn btn-link" @onclick="(() => RemoveUser(user))">❌</button>
<label>@user.Name</label>
</li>
}
</ul>
<br />
@code {
// 파라미터를 명시하여 사용
[Parameter] public List<UserData> Users { get; set; }
// 자식 컴포넌트에서 부모의 컴포넌트 함수를 호출하기위한 액션함수
[Parameter]
public EventCallback CallBackTest { get; set; }
// 해당 페이지에 접속한경우, Unity의 Start와 비슷한 느낌
protected override void OnInitialized()
{
//더미 데이터 세개 추가
Users.Add(new UserData() { Name = "Kim" });
Users.Add(new UserData() { Name = "Lee" });
Users.Add(new UserData() { Name = "Park" });
}
public void AddUser(UserData user)
{
Users.Add(user);
}
public void RemoveUser(UserData user)
{
Users.Remove(user);
CallBackTest.InvokeAsync(null);
}
}
- 유저 수를 보여주는 컴포넌트를 분리하여 다른 페이지에서는 간단하게 호출만하면 이 기능을 보여줄 수 있도록 새로운 클래스파일을 생성하여 구현합니다.
// 파라미터를 명시하여 사용
[Parameter] public List<UserData> Users { get; set; }
// 자식 컴포넌트에서 부모의 컴포넌트 함수를 호출하기위한 액션함수
[Parameter]
public EventCallback CallBackTest { get; set; }
- [Parameter]은 외부에서 이 컴포넌트의 변수들을 사용한다는 목적으로 선언하는것입니다.
- ShowUser.razor을 사용하는 다른 페이지는 ShowUser 내부 스크립트 기능을 이용하기위해 이 파라미터에 접근합니다.
· User.razor
<!-- 페이지 이름 지정 -->
@page "/user"
<!-- 필요한 스크립트 Using -->
@using BlazorApp.Data;
<h3>Online Users</h3>
<ShowUser Users="_users" CallBackTest="CallBackTestFunc" @ref="_showUser"></ShowUser>
<div class="container">
<div class="row">
<div class="col">
<input class="form-control" placeholder="Add User" @bind-value="_inputName" />
</div>
<div class="col">
<!-- 속성(attribute)에도 바인딩을 할 수 있음!-->
<!-- conditional attruibute 속성 자체에 조건을 붙일 수 있음!-->
<button class="btn btn-primary" type="button" @onclick="AddUser" disabled="@(_users.Count() >= 5)">Add a User</button>
</div>
</div>
</div>
@code {
List<UserData> _users = new List<UserData>();
ShowUser _showUser;
string _inputName;
private void AddUser()
{
_showUser.AddUser(new UserData() { Name = _inputName });
}
private void KickUser(UserData user)
{
_showUser.RemoveUser(user);
}
void CallBackTestFunc()
{
_inputName = "CallbackTest";
//StateHasChanged(); EventCallback을 사용할경우 업데이트를 자동으로 해줌!
}
}
- User.razor에서는 ShowUser에 해당하는 HTML코드가 제거되고 아래의 코드로 대체되어있습니다.
<ShowUser Users="_users" CallBackTest="CallBackTestFunc" @ref="_showUser"></ShowUser>
- <ShowUser>에서 Users="_users"는 User.razor의 컴포넌트에 있는 스크립트에서 사용할 _users변수를 ShowUser.razor의 Users와 동기화 시키겠다는 표현입니다.
- CallBackTest="CallBackTestFunc은 콜백함수인 CallBackTestFunc()을 CallBackTest변수에 바인딩한 것 입니다.
- 빨간 사각형 영역의 내용은 ShowUser.razor 컴포넌트 구성요소에 의해 생성되었습니다.
'server > web server' 카테고리의 다른 글
[Web] 템플릿 컴포넌트 (0) | 2023.02.24 |
---|---|
[Web] Cascading 파라미터 (0) | 2023.02.24 |
[Web] 바인딩 변수 업데이트 (0) | 2023.02.23 |
[Web] 속성 바인딩 (0) | 2023.02.23 |
[Web] List 바인딩 (0) | 2023.02.23 |