Skip to content

Commit ba03fac

Browse files
authored
fix(Search): network delay causes input lag (#5576)
* refactor: 提炼 BootstrapBlazorRender 组件 * refactor: 适配网络卡顿 * refactor: 移除 BootstrapBlazorRender 组件使用 RenderTemplate 代替 * refactor: 代码格式化 * doc: 增加 Clear 处理逻辑 * chore: bump version 9.4.9-beta02
1 parent def8f94 commit ba03fac

File tree

9 files changed

+51
-81
lines changed

9 files changed

+51
-81
lines changed

src/BootstrapBlazor.Server/Components/Pages/Coms.razor

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
<div class="coms-search">
55
<div class="row">
66
<div class="col-12">
7-
<Search @bind-Value="@SearchText" PlaceHolder="@Localizer["Search"]" OnSearch="@OnSearch" ShowClearButton="true"></Search>
7+
<Search @bind-Value="@SearchText" PlaceHolder="@Localizer["Search"]"
8+
OnSearch="@OnSearch" OnClear="OnClear" ShowClearButton="true"></Search>
89
</div>
910
</div>
1011
<div class="coms-search-filter">

src/BootstrapBlazor.Server/Components/Pages/Coms.razor.cs

+7
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,11 @@ public sealed partial class Coms
1919
SearchText = searchText;
2020
return Task.FromResult<IEnumerable<string?>>(ComponentItems.Where(i => i.Contains(searchText, StringComparison.OrdinalIgnoreCase)).ToList());
2121
}
22+
23+
private Task OnClear(string searchText)
24+
{
25+
SearchText = "";
26+
StateHasChanged();
27+
return Task.CompletedTask;
28+
}
2229
}

src/BootstrapBlazor/BootstrapBlazor.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk.Razor">
22

33
<PropertyGroup>
4-
<Version>9.4.9-beta01</Version>
4+
<Version>9.4.9-beta02</Version>
55
</PropertyGroup>
66

77
<ItemGroup>

src/BootstrapBlazor/Components/AutoComplete/AutoComplete.razor

+3-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@
1616
placeholder="@PlaceHolder" disabled="@Disabled" @ref="FocusElement"/>
1717
<span class="form-select-append"><i class="@Icon"></i></span>
1818
<span class="form-select-append ac-loading"><i class="@LoadingIcon"></i></span>
19-
<RenderTemplate ChildContent="RenderItems"></RenderTemplate>
19+
<RenderTemplate @ref="_dropdown">
20+
@RenderDropdown
21+
</RenderTemplate>
2022
</div>
2123

2224
@code {

src/BootstrapBlazor/Components/AutoComplete/AutoComplete.razor.cs

+2-10
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ public partial class AutoComplete
9090
private List<string>? _filterItems;
9191

9292
[NotNull]
93-
private AutoCompleteItems? _dropdown = default;
93+
private RenderTemplate? _dropdown = default;
9494

9595
/// <summary>
9696
/// <inheritdoc/>
@@ -187,15 +187,7 @@ public override Task TriggerChange(string val)
187187
StateHasChanged();
188188
}
189189
_render = true;
190-
_dropdown.RenderContent();
190+
_dropdown.Render();
191191
return Task.CompletedTask;
192192
}
193-
194-
private RenderFragment RenderItems => builder =>
195-
{
196-
builder.OpenComponent<AutoCompleteItems>(0);
197-
builder.AddAttribute(10, "ChildContent", RenderDropdown);
198-
builder.AddComponentReferenceCapture(20, dropdown => _dropdown = (AutoCompleteItems)dropdown);
199-
builder.CloseComponent();
200-
};
201193
}

src/BootstrapBlazor/Components/AutoComplete/AutoCompleteItems.cs

-60
This file was deleted.

src/BootstrapBlazor/Components/BaseComponents/RenderTemplate.razor.cs

+11-3
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,18 @@
66
namespace BootstrapBlazor.Components;
77

88
/// <summary>
9-
/// RenderTemplate 组件
9+
/// RenderTemplate component
1010
/// </summary>
1111
public partial class RenderTemplate
1212
{
1313
/// <summary>
14-
/// 获得/设置 子组件
14+
/// Gets or sets the child component
1515
/// </summary>
1616
[Parameter]
1717
public RenderFragment? ChildContent { get; set; }
1818

1919
/// <summary>
20-
/// 获得/设置 首次加载回调委托
20+
/// Gets or sets the callback delegate for the first load
2121
/// </summary>
2222
[Parameter]
2323
public Func<bool, Task>? OnRenderAsync { get; set; }
@@ -36,4 +36,12 @@ protected override async Task OnAfterRenderAsync(bool firstRender)
3636
await OnRenderAsync(firstRender);
3737
}
3838
}
39+
40+
/// <summary>
41+
/// Render method
42+
/// </summary>
43+
public void Render()
44+
{
45+
StateHasChanged();
46+
}
3947
}

src/BootstrapBlazor/Components/Search/Search.razor

+10-3
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,14 @@
5555
<Button Color="SearchButtonColor" Text="@SearchButtonText" Icon="@ButtonIcon" OnClick="OnSearchClick" aria-label="Search"></Button>
5656
}
5757
</div>
58-
<ul class="dropdown-menu">
58+
<RenderTemplate @ref="_dropdown">
59+
@RenderDropdown
60+
</RenderTemplate>
61+
</div>
62+
63+
@code {
64+
RenderFragment RenderDropdown =>
65+
@<ul class="dropdown-menu">
5966
@foreach (var item in _filterItems)
6067
{
6168
<li class="dropdown-item" @onclick="() => OnClickItem(item)">
@@ -73,5 +80,5 @@
7380
{
7481
<li class="dropdown-item">@NoDataTip</li>
7582
}
76-
</ul>
77-
</div>
83+
</ul>;
84+
}

src/BootstrapBlazor/Components/Search/Search.razor.cs

+15-2
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,9 @@ public partial class Search<TValue>
171171

172172
private SearchContext<TValue> _context = default!;
173173

174+
[NotNull]
175+
private RenderTemplate? _dropdown = default;
176+
174177
/// <summary>
175178
/// <inheritdoc/>
176179
/// </summary>
@@ -205,6 +208,14 @@ protected override void OnParametersSet()
205208
}
206209
}
207210

211+
private bool _render = true;
212+
213+
/// <summary>
214+
/// <inheritdoc/>
215+
/// </summary>
216+
/// <returns></returns>
217+
protected override bool ShouldRender() => _render;
218+
208219
private string _displayText = "";
209220
/// <summary>
210221
/// 点击搜索按钮时触发此方法
@@ -218,7 +229,7 @@ private async Task OnSearchClick()
218229
await Task.Yield();
219230

220231
var items = await OnSearch(_displayText);
221-
_filterItems = items.ToList();
232+
_filterItems = [.. items];
222233
ButtonIcon = SearchButtonIcon;
223234
if (IsTriggerSearchByInput == false)
224235
{
@@ -280,11 +291,13 @@ private async Task OnClickItem(TValue val)
280291
[JSInvokable]
281292
public override async Task TriggerChange(string val)
282293
{
294+
_render = false;
283295
_displayText = val;
284-
285296
if (IsTriggerSearchByInput)
286297
{
287298
await OnSearchClick();
288299
}
300+
_render = true;
301+
_dropdown.Render();
289302
}
290303
}

0 commit comments

Comments
 (0)