|
|
@@ -71,29 +71,29 @@ export default function MobileFilter({
|
|
|
console.log("【抽屉是否打开isOpen】", isOpen);
|
|
|
}, [isOpen, filters]);
|
|
|
|
|
|
- /**
|
|
|
- * 单选
|
|
|
- */
|
|
|
- const toggleOption = (code: string, id: string) => {
|
|
|
- setTempFilters((prev) => {
|
|
|
- const current = prev[code];
|
|
|
-
|
|
|
- if (current === id) {
|
|
|
- const next = { ...prev };
|
|
|
-
|
|
|
- delete next[code];
|
|
|
- // 打印点击后最新的临时筛选
|
|
|
- console.log("【点击选项后临时筛选tempFilters】", next);
|
|
|
- return next;
|
|
|
- }
|
|
|
-
|
|
|
- return {
|
|
|
- ...prev,
|
|
|
+ const toggleOption = (code: string, id: string) => {
|
|
|
+ setTempFilters((prev) => {
|
|
|
+ const currentStr = prev[code] ?? "";
|
|
|
+ const selectedSet = new Set(currentStr ? currentStr.split(",") : []);
|
|
|
+ // debugger
|
|
|
+ if (selectedSet.has(id)) {
|
|
|
+ // 已选中 → 删除
|
|
|
+ selectedSet.delete(id);
|
|
|
+ } else {
|
|
|
+ // 未选中 → 添加
|
|
|
+ selectedSet.add(id);
|
|
|
+ }
|
|
|
|
|
|
- [code]: id,
|
|
|
- };
|
|
|
- });
|
|
|
- };
|
|
|
+ const next = { ...prev };
|
|
|
+ if (selectedSet.size === 0) {
|
|
|
+ delete next[code];
|
|
|
+ } else {
|
|
|
+ next[code] = Array.from(selectedSet).join(",");
|
|
|
+ }
|
|
|
+ console.log("【点击选项后临时筛选tempFilters】", next);
|
|
|
+ return next;
|
|
|
+ });
|
|
|
+};
|
|
|
|
|
|
const toggleGroupExpand = (code: string) => {
|
|
|
setExpandedGroups((prev) => ({
|
|
|
@@ -175,39 +175,37 @@ export default function MobileFilter({
|
|
|
<FilterPrice
|
|
|
priceAttr={attr.node}
|
|
|
initialRange={{
|
|
|
- minPrice: tempFilters.minPrice
|
|
|
- ? Number(tempFilters.minPrice)
|
|
|
+ minPrice: tempFilters.price_from
|
|
|
+ ? Number(tempFilters.price_from)
|
|
|
: undefined,
|
|
|
- maxPrice: tempFilters.maxPrice
|
|
|
- ? Number(tempFilters.maxPrice)
|
|
|
+ maxPrice: tempFilters.price_to
|
|
|
+ ? Number(tempFilters.price_to)
|
|
|
: undefined,
|
|
|
}}
|
|
|
onChangeComplete={(range) => {
|
|
|
setTempFilters((prev) => ({
|
|
|
...prev,
|
|
|
- minPrice: String(range.minPrice),
|
|
|
- maxPrice: String(range.maxPrice),
|
|
|
+ price_from: String(range.minPrice),
|
|
|
+ price_to: String(range.maxPrice),
|
|
|
}));
|
|
|
}}
|
|
|
/>
|
|
|
) : (
|
|
|
- (attr.node.options.edges || []).map((opt: any) => {
|
|
|
- const checked =
|
|
|
- tempFilters[attr.node.code] == opt.node._id;
|
|
|
- return (
|
|
|
+ (attr.node.options.edges || []).map((opt: any) => {
|
|
|
+ const selectedStr = tempFilters[attr.node.code] ?? "";
|
|
|
+ const idStr = String(opt.node._id);
|
|
|
+ const checked = selectedStr.split(",").includes(idStr);
|
|
|
+ return opt.node.productCount > 0 && (
|
|
|
<label
|
|
|
key={opt.node._id}
|
|
|
- className="flex gap-3 text-lg"
|
|
|
+ className="flex gap-3 text-lg items-center"
|
|
|
>
|
|
|
<input
|
|
|
type="checkbox"
|
|
|
checked={checked}
|
|
|
- onChange={() =>
|
|
|
- toggleOption(attr.node.code, opt.node._id)
|
|
|
- }
|
|
|
+ onChange={() => toggleOption(attr.node.code, String(opt.node._id))}
|
|
|
/>
|
|
|
-
|
|
|
- <span>{opt.node.adminName}</span>
|
|
|
+ <span className="wrap-break-word">{opt.node.adminName}</span>
|
|
|
</label>
|
|
|
);
|
|
|
})
|