import { useEffect, useMemo, useState } from 'react'; import { View, Text, ScrollView } from '@tarojs/components'; export type StoreCategoryNode = { id: string; name: string; children?: StoreCategoryNode[]; }; export type CategorySelection = { parentId: string; parentName: string; childId: string; childName: string; }; export const EMPTY_CATEGORY: CategorySelection = { parentId: '', parentName: '', childId: '', childName: '', }; export function formatCategoryLabel(sel: CategorySelection): string { if (sel.childName) return sel.childName; if (sel.parentName) return sel.parentName; return '全部分类'; } type CategoryPickerProps = { open: boolean; tree: StoreCategoryNode[]; value: CategorySelection; onClose: () => void; onConfirm: (next: CategorySelection) => void; }; type TabKey = 'parent' | 'child'; export default function CategoryPicker({ open, tree, value, onClose, onConfirm, }: CategoryPickerProps) { const [draft, setDraft] = useState(value); const [activeTab, setActiveTab] = useState('parent'); useEffect(() => { if (!open) return; setDraft(value); setActiveTab(value.parentId ? 'child' : 'parent'); }, [open, value]); const children = useMemo(() => { const parent = tree.find((n) => n.id === draft.parentId); return parent?.children ?? []; }, [tree, draft.parentId]); if (!open) return null; function selectParent(node: StoreCategoryNode | null) { if (!node) { setDraft(EMPTY_CATEGORY); return; } setDraft({ parentId: node.id, parentName: node.name, childId: '', childName: '', }); setActiveTab('child'); } function selectChild(node: StoreCategoryNode | null) { if (!node) { setDraft((prev) => ({ ...prev, childId: '', childName: '' })); return; } setDraft((prev) => ({ ...prev, childId: node.id, childName: node.name, })); } function handleConfirm() { onConfirm(draft); onClose(); } return ( e.stopPropagation()}> setActiveTab('parent')} > {draft.parentName || '大类'} draft.parentId && setActiveTab('child')} > {draft.childName || '细类'} 确定 {activeTab === 'parent' ? ( <> selectParent(null)} > 全部分类 {tree.map((item) => ( selectParent(item)} > {item.name} ))} ) : ( <> selectChild(null)} > 全部细类 {children.map((item) => ( selectChild(item)} > {item.name} ))} )} ); }