Skip to content

Commit 3b13e49

Browse files
committed
refactor: 更新下拉框组件
1 parent 72c7d17 commit 3b13e49

File tree

2 files changed

+20
-38
lines changed

2 files changed

+20
-38
lines changed

src/BootstrapBlazor/Components/AutoComplete/AutoComplete.razor

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -16,23 +16,6 @@
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-
<ul class="dropdown-menu">
20-
@foreach (var item in Rows)
21-
{
22-
<li @key="item" class="dropdown-item" @onclick="() => OnClickItem(item)">
23-
@if (ItemTemplate == null)
24-
{
25-
<div>@item</div>
26-
}
27-
else
28-
{
29-
@ItemTemplate(item)
30-
}
31-
</li>
32-
}
33-
@if (ShowNoDataTip && Rows.Count == 0)
34-
{
35-
<li class="dropdown-item">@NoDataTip</li>
36-
}
37-
</ul>
19+
<DropdownMenu @ref="_dropdown" ShowNoDataTip="ShowNoDataTip" NoDataTip="@NoDataTip"
20+
OnItemClick="@OnClickItem" Rows="@Rows" ItemTemplate="@ItemTemplate"></DropdownMenu>
3821
</div>

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

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,9 @@ public partial class AutoComplete
8989

9090
private List<string>? _filterItems;
9191

92+
[NotNull]
93+
private DropdownMenu? _dropdown = default;
94+
9295
/// <summary>
9396
/// <inheritdoc/>
9497
/// </summary>
@@ -114,6 +117,14 @@ protected override void OnParametersSet()
114117
Items ??= [];
115118
}
116119

120+
private bool _render = true;
121+
122+
/// <summary>
123+
/// <inheritdoc/>
124+
/// </summary>
125+
/// <returns></returns>
126+
protected override bool ShouldRender() => _render;
127+
117128
/// <summary>
118129
/// Callback method when a candidate item is clicked
119130
/// </summary>
@@ -135,9 +146,6 @@ private async Task OnClickItem(string val)
135146
[JSInvokable]
136147
public override async Task TriggerFilter(string val)
137148
{
138-
// Store the current input value to prevent it from being overwritten
139-
var currentInputValue = val;
140-
141149
if (OnCustomFilter != null)
142150
{
143151
var items = await OnCustomFilter(val);
@@ -161,14 +169,7 @@ public override async Task TriggerFilter(string val)
161169
_filterItems = [.. _filterItems.Take(DisplayCount.Value)];
162170
}
163171

164-
// Use currentInputValue here instead of potentially stale val
165-
CurrentValue = currentInputValue;
166-
167-
// Only trigger StateHasChanged if no binding is present
168-
if (!ValueChanged.HasDelegate)
169-
{
170-
StateHasChanged();
171-
}
172+
await TriggerChange(val);
172173
}
173174

174175
/// <summary>
@@ -178,16 +179,14 @@ public override async Task TriggerFilter(string val)
178179
[JSInvokable]
179180
public override Task TriggerChange(string val)
180181
{
181-
// Only update CurrentValue if the value has actually changed
182-
// This prevents overwriting the user's input
183-
if (CurrentValue != val)
182+
_render = false;
183+
CurrentValue = val;
184+
if (!ValueChanged.HasDelegate)
184185
{
185-
CurrentValue = val;
186-
if (!ValueChanged.HasDelegate)
187-
{
188-
StateHasChanged();
189-
}
186+
StateHasChanged();
190187
}
188+
_render = true;
189+
_dropdown.Render(Rows);
191190
return Task.CompletedTask;
192191
}
193192
}

0 commit comments

Comments
 (0)