Skip to content

Commit 66cd8f7

Browse files
committed
refactor: 增加内部缓存提高性能
1 parent 8910426 commit 66cd8f7

File tree

2 files changed

+34
-3
lines changed

2 files changed

+34
-3
lines changed

src/BootstrapBlazor/Components/Select/MultiSelect.razor

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@
6666
@ButtonTemplate
6767
</div>
6868
}
69-
@foreach (var itemGroup in GetData().GroupBy(i => i.GroupName))
69+
@foreach (var itemGroup in Rows.GroupBy(i => i.GroupName))
7070
{
7171
if (!string.IsNullOrEmpty(itemGroup.Key))
7272
{
@@ -102,7 +102,7 @@
102102
</DynamicElement>
103103
}
104104
}
105-
@if (GetData().Count == 0)
105+
@if (Rows.Count == 0)
106106
{
107107
<div class="dropdown-item">@NoSearchDataText</div>
108108
}

src/BootstrapBlazor/Components/Select/MultiSelect.razor.cs

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,17 @@ public partial class MultiSelect<TValue>
195195
[NotNull]
196196
private IStringLocalizer<MultiSelect<TValue>>? Localizer { get; set; }
197197

198+
private List<SelectedItem>? _itemsCache;
199+
200+
private List<SelectedItem> Rows
201+
{
202+
get
203+
{
204+
_itemsCache ??= string.IsNullOrEmpty(SearchText) ? GetRowsByItems() : GetRowsBySearch();
205+
return _itemsCache;
206+
}
207+
}
208+
198209
private string? PreviousValue { get; set; }
199210

200211
private string? PlaceholderString => SelectedItems.Count == 0 ? PlaceHolder : null;
@@ -220,7 +231,6 @@ protected override void OnParametersSet()
220231
ClearIcon ??= IconTheme.GetIconByKey(ComponentIcons.MultiSelectClearIcon);
221232

222233
ResetItems();
223-
OnSearchTextChanged ??= text => Items.Where(i => i.Text.Contains(text, StringComparison.OrdinalIgnoreCase));
224234
ResetRules();
225235

226236
// 通过 Value 对集合进行赋值
@@ -250,6 +260,26 @@ protected override void OnAfterRender(bool firstRender)
250260
/// <returns></returns>
251261
protected override Task InvokeInitAsync() => InvokeVoidAsync("init", Id, Interop, new { ConfirmMethodCallback = nameof(ConfirmSelectedItem), SearchMethodCallback = nameof(TriggerOnSearch), TriggerEditTag = nameof(TriggerEditTag), ToggleRow = nameof(ToggleRow) });
252262

263+
private List<SelectedItem> GetRowsByItems()
264+
{
265+
var items = new List<SelectedItem>();
266+
if (Items != null)
267+
{
268+
items.AddRange(Items);
269+
}
270+
return items;
271+
}
272+
273+
private List<SelectedItem> GetRowsBySearch()
274+
{
275+
var items = OnSearchTextChanged?.Invoke(SearchText) ?? FilterBySearchText(GetRowsByItems());
276+
return items.ToList();
277+
}
278+
279+
private IEnumerable<SelectedItem> FilterBySearchText(IEnumerable<SelectedItem> source) => string.IsNullOrEmpty(SearchText)
280+
? source
281+
: source.Where(i => i.Text.Contains(SearchText, StringComparison));
282+
253283
/// <summary>
254284
/// FormatValueAsString 方法
255285
/// </summary>
@@ -540,6 +570,7 @@ private void ResetItems()
540570
[JSInvokable]
541571
public Task TriggerOnSearch(string searchText)
542572
{
573+
_itemsCache = null;
543574
SearchText = searchText;
544575
StateHasChanged();
545576
return Task.CompletedTask;

0 commit comments

Comments
 (0)