【发布时间】:2021-04-01 16:04:21
【问题描述】:
我正在尝试使用 .Net 5 和 blazor 创建一个论坛网站。为了有效地加载论坛线程,我正在尝试使用新的Virtualize 组件。
我有一个问题。它只加载前 35 个项目,然后不响应滚动,所以我有一个巨大的空白空间,应该加载项目。
以下是代码页面。
请不要介意 LoadSvar 方法只是在列表中获取一个范围,它目前只是用于测试。最后它会调用一个有范围的服务。
@page "/Traade/{traadid}"
@using ViewModels.Traade
@using Entities.Traad
@inject ISvarService SvarService
@inject ICurrentUserService CurrentUserService
@if (_loaded)
{
<div class="container">
<div class="margin-top-10px">
<div class="row">
<div class="col-xl-3 space-content">
<div class="margin-bottom-10px">
<ForumOversigt></ForumOversigt>
</div>
<div>
<KoebSalgOversigt></KoebSalgOversigt>
</div>
</div>
<div class="col-xl-6 space-content">
<div class="margin-bottom-10px">
<MainSvar Traad="@_listSvarViewModel.Traad"></MainSvar>
</div>
<Virtualize ItemsProvider="@LoadSvar">
<ItemContent>
<SvarItem Svar="@context"
IsAuthenticated="@_isAuthenticated"
IsAdmin="@_listSvarViewModel.IsAdmin">
</SvarItem>
</ItemContent>
<Placeholder>
<LoadingScreen></LoadingScreen>
</Placeholder>
</Virtualize>
@* @foreach (var svar in _listSvarViewModel.Svar) *@
@* { *@
@* _svarCount++; *@
@* if (svar.IsHidden && !_listSvarViewModel.IsAdmin) *@
@* { *@
@* continue; *@
@* } *@
@* <div class="margin-bottom-10px"> *@
@* @if (_svarCount == _total) *@
@* { *@
@* <span id="seneste"></span> *@
@* } *@
@* <SvarItem Svar="@svar" SvarCount="@_svarCount" IsAuthenticated="@_isAuthenticated"></SvarItem> *@
@* </div> *@
@* } *@
<CascadingValue Value="this">
@if (_isAuthenticated)
{
<span id="seneste"></span>
<CreateSvar Traad="@_listSvarViewModel.Traad"></CreateSvar> }
else
{
<span id="seneste"></span>
<CreateSvarGuest Traad="@_listSvarViewModel.Traad"></CreateSvarGuest> }
</CascadingValue>
</div>
<div class="col-xl-3 space-content">
<FrontPageSettings></FrontPageSettings>
</div>
</div>
</div>
</div>
}
else
{
<LoadingScreen/>
}
@code {
[CascadingParameter]
private Task<AuthenticationState> AuthenticationStateTask { get; set; }
[Parameter]
public string TraadId { get; set; }
bool _loaded;
ListSvarViewModel _listSvarViewModel = new();
bool _isAuthenticated;
int _svarCount;
int _total;
public override Task SetParametersAsync(ParameterView parameters)
{
_loaded = false;
return base.SetParametersAsync(parameters);
}
protected override async Task OnParametersSetAsync()
{
//Get is admin from userService
await UpdatePageInformation();
_isAuthenticated = await CurrentUserService.IsAuthenticated();
StateHasChanged();
}
public async Task UpdatePageInformation()
{
_listSvarViewModel = await SvarService.GetListSvarViewModel(int.Parse(TraadId), false);
_total = _listSvarViewModel.Svar.Count;
}
protected override void OnAfterRender(bool firstRender)
{
if (firstRender) return;
_loaded = true;
_svarCount = 0;
StateHasChanged();
}
private async ValueTask<ItemsProviderResult<Svar>> LoadSvar(ItemsProviderRequest request)
{
var numSvar = Math.Min(request.Count, _total - request.StartIndex);
var listOfSvar = _listSvarViewModel.Svar.GetRange(request.StartIndex, numSvar);
return new ItemsProviderResult<Svar>(listOfSvar, _total);
}
}
如您所见,它不再加载任何项目。
它会在渲染时触发 LoadSvar 方法,该方法会渲染 400 多个项目中的 35 个。但是滚动不会再次触发该方法以加载更多内容。
我在这里拉头发。 out 注释的foreach 循环不够快,所以我真的很想让Virtualize 组件工作。
【问题讨论】:
-
浏览器控制台有错误吗?您是否尝试过使用
Items而不是ItemsProvider来看看是否可行? -
@user3071284 没有错误,是的,我都试过了。我可以再试一次并报告
-
只是为了确认。回到项目没有帮助。
标签: blazor blazor-server-side .net-5