"use client" import { useMemo, useState } from "react" import { Slider } from "@/components/ui/slider" import { Checkbox } from "@/components/ui/checkbox" import { Button } from "@/components/ui/button" import UserList from "./user-list" import useDebounce from "@/hooks/use-debounce" type UserStatus = "活跃" | "沉睡" | "流失风险" export default function UserSearch({ query }: { query: string }) { const [status, setStatus] = useState([]) const [rfm, setRfm] = useState<[number, number]>([0, 100]) const debouncedQ = useDebounce(query, 300) const qs = useMemo(() => { const p = new URLSearchParams() if (debouncedQ.trim()) p.set("q", debouncedQ.trim()) if (status.length) p.set("status", status.join(",")) if (rfm[0] !== 0) p.set("rfmMin", String(rfm[0])) if (rfm[1] !== 100) p.set("rfmMax", String(rfm[1])) p.set("page", "1") p.set("pageSize", "20") return p.toString() }, [debouncedQ, status, rfm]) return (

用户搜索与筛选

{/* 过滤区 */}
状态
{(["活跃", "沉睡", "流失风险"] as UserStatus[]).map((s) => { const checked = status.includes(s) return ( ) })}
RFM 区间
setRfm([v[0], v[1]] as [number, number])} className="w-full" />
{rfm[0]} {rfm[1]}
{/* 列表区 */}
) }