C#/Blazor

[Blazor] Virtualize 가상화 처리

kjun.kr 2023. 7. 20. 22:40
728x90
728x170

Blazor에서 Virtualize (가상화 처리) 하는 방법입니다.

목록데이터를 표시할 때 양이 많은 경우 가상화 처리를 통해 메모리 사용을 줄일 수 있습니다.

Index.razor

@page "/"

<PageTitle>Cars</PageTitle>

@if (cars == null)
{
    <p><em>Loading cars...</em></p>
}
else
{
    <table class="table" height="800px">
        <thead>
            <tr>
                <th>Id</th>
                <th>Name</th>
                <th>Cost</th>
            </tr>
        </thead>
        <tbody>
          @*@foreach (var car in cars)
            {
                <tr>
                  <td>@car.Id</td>
                  <td>@car.Name</td>
                  <td>@car.Cost</td>
                </tr>
            }*@
            
            <Virtualize Items="cars" Context="car" OverscanCount="5" ItemSize="15" SpacerElement="tr">
                <tr>
                    <td>@car.Id</td>
                    <td>@car.Name</td>
                    <td>@car.Cost</td>
                </tr>
            </Virtualize>
            
        </tbody>
    </table>
}

@code{
    private List<Car> cars;

    protected override async Task OnInitializedAsync()
    {
        cars = await MakeCars(1000);
    }

    private async Task<List<Car>> MakeCars(int count)
    {
        List<Car> myCarList = new List<Car>();

        for (int i = 0; i < count; i++)
        {
            var car = new Car()
                {
                    Id = Guid.NewGuid(),
                    Name = $"Car {i}",
                    Cost = i * Random.Shared.Next(50,100)
                };

            myCarList.Add(car);
        }
        return await Task.FromResult(myCarList);
    }


    public class Car
    {
        public Guid Id { get; set; }
        public string? Name { get; set; }
        public int Cost { get; set; }
    }
}

위 코드에서 보면 알 수 있듯이

아래의 코드를 

@foreach (var car in cars)
{
      <tr>
        <td>@car.Id</td>
        <td>@car.Name</td>
        <td>@car.Cost</td>
      </tr>
}

아래처럼 Virtualize를 사용하면 가상화 처리가 됩니다.

<Virtualize Items="cars" Context="car" OverscanCount="5" ItemSize="15" SpacerElement="tr">
    <tr>
        <td>@car.Id</td>
        <td>@car.Name</td>
        <td>@car.Cost</td>
    </tr>
</Virtualize>

개발자 도구를 통해 보면 모든 데이터가 표시되지 않고 스크롤될 때 일정양만 가지고 있는 것을 알 수 있습니다.

총 1000건이지만 일부 데이터만 가지고 있으며 스크롤할 때도 일부데이터만 가지고 표시되는 걸 확인할 수 있습니다.

 

소스
https://github.com/kei-soft/Blazor.AppTest/tree/master/Blazor.VirtualizationTest

 

728x90
그리드형