Skip to content

Commit 1a323ab

Browse files
committed
feat: 增加搜索逻辑
1 parent 4b3baac commit 1a323ab

2 files changed

Lines changed: 47 additions & 26 deletions

File tree

src/components/BootstrapBlazor.Region/Components/SelectCity.razor.cs

Lines changed: 42 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
33
// Website: https://www.blazor.zone or https://argozhang.github.io/
44

5+
using System.Runtime.CompilerServices;
6+
57
namespace BootstrapBlazor.Components;
68

79
/// <summary>
@@ -43,7 +45,11 @@ public partial class SelectCity
4345
private readonly HashSet<string> _values = [];
4446
private string? _searchText;
4547

46-
private string? GetActiveClass(string item) => _values.Contains(item) || CurrentValue == item ? "active" : null;
48+
private string? GetActiveClass(string item) => CssBuilder.Default()
49+
.AddClass("active", _values.Contains(item) || CurrentValue == item)
50+
.AddClass("prev", !string.IsNullOrEmpty(_searchText) && PinYinService.GetFirstLetters(item).StartsWith(_searchText))
51+
.Build();
52+
4753

4854
/// <summary>
4955
/// <inheritdoc/>
@@ -98,18 +104,18 @@ private RenderFragment RenderCities() => builder =>
98104
}
99105
};
100106

101-
private void OnSelectProvince(string province)
107+
private void OnSelectProvince(string provinceName)
102108
{
103109
if (!IsMultiple)
104110
{
105111
return;
106112
}
107113

108-
HashSet<string> cities = province switch
114+
HashSet<string> cities = provinceName switch
109115
{
110116
"直辖市" => Municipalities,
111117
"特别行政区" => SpecialAdministrativeRegions,
112-
_ => GetCities(province)
118+
_ => GetCities(provinceName)
113119
};
114120
foreach (var city in cities.Where(city => !_values.Remove(city)))
115121
{
@@ -141,16 +147,41 @@ private HashSet<string> GetProvinces()
141147
return Provinces;
142148
}
143149

144-
// 处理直辖市
145-
if (PinYinZXS.Contains(_searchText))
146-
{
147-
return ["直辖市"];
148-
}
150+
return [.. GenerateProvincePinYin().Where(i => FilterProvince(i, _searchText)).Select(i => i.Name)];
151+
}
149152

150-
return Provinces;
153+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
154+
private static bool FilterProvince(ProvinceItem item, string searchText) => item.PinYin.StartsWith(searchText) || item.Cities.Any(city => city.PinYin.StartsWith(searchText));
155+
156+
private static HashSet<ProvinceItem>? _provinceItems;
157+
158+
private HashSet<ProvinceItem> GenerateProvincePinYin()
159+
{
160+
_provinceItems ??= [.. Provinces.Select(i => new ProvinceItem()
161+
{
162+
PinYin = PinYinService.GetFirstLetters(i),
163+
Name = i,
164+
Cities = [.. GetCities(i).Select(i => new CityItem()
165+
{
166+
PinYin = PinYinService.GetFirstLetters(i),
167+
Name = i
168+
})]
169+
})];
170+
return _provinceItems;
151171
}
152172

153-
private static readonly HashSet<string> PinYinZXS = ["BJ", "TJ", "SH", "CQ"];
173+
private HashSet<string> GetCities(string provinceName) => provinceName switch
174+
{
175+
"直辖市" => Municipalities,
176+
"特别行政区" => SpecialAdministrativeRegions,
177+
_ => RegionService.GetCities(provinceName)
178+
};
179+
180+
private static HashSet<CityItem> GenerateCityPinYin(HashSet<string> cities) => [.. cities.Select(i => new CityItem()
181+
{
182+
PinYin = PinYinService.GetFirstLetters(i),
183+
Name = i
184+
})];
154185

155186
private static readonly HashSet<string> Provinces = [
156187
"直辖市",
@@ -188,19 +219,4 @@ private HashSet<string> GetProvinces()
188219
private static readonly HashSet<string> Municipalities = ["北京市", "天津市", "上海市", "重庆市"];
189220

190221
private static readonly HashSet<string> SpecialAdministrativeRegions = ["香港特别行政区", "澳门特别行政区"];
191-
192-
private HashSet<string> GetCities(string provinceName)
193-
{
194-
if (provinceName == "直辖市")
195-
{
196-
return Municipalities;
197-
}
198-
199-
if (provinceName == "特别行政区")
200-
{
201-
return SpecialAdministrativeRegions;
202-
}
203-
204-
return RegionService.GetCities(provinceName);
205-
}
206222
}

src/components/BootstrapBlazor.Region/Components/SelectCity.razor.css

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,11 @@
5555
color: var(--bb-region-body-active-color);
5656
}
5757

58+
.dropdown-menu-city li.prev {
59+
background-color: var(--bb-region-body-hover-bg-color);
60+
color: var(--bb-region-body-hover-color);
61+
}
62+
5863
[data-bs-theme="dark"] .dropdown-menu-city {
5964
--bb-region-body-color: #c0c4cc;
6065
--bb-region-body-hover-color: #fff;

0 commit comments

Comments
 (0)