概览`useTransition` 能将高开销更新标记为过渡,从而避免阻塞输入路径。适合搜索过滤与大列表渲染场景,结合挂起提示提升可用性。基础实现'use client' import { useMemo, useState, useTransition } from 'react' export default function FilterList({ items }: { items: string[] }) { const [q, setQ] = useState('') const [pending, startTransition] = useTransition() const [filtered, setFiltered] = useState<string[]>(items) function onInput(v: string) { setQ(v) startTransition(() => { const next = heavyFilter(items, v) setFiltered(next) }) } return ( <div> <input value={q} onChange={(e) => onInput(e.target.value)} aria-controls="list" /> {pending && <p role="status">筛选中…</p>} <ul id="list"> {filtered.map((s) => (<li key={s}>{s}</li>))} </ul> </div> ) } function heavyFilter(arr: string[], q: string) { if (!q) return arr const lq = q.toLowerCase() return arr.filter((s) => s.toLowerCase().includes(lq)) } 治理要点- 将昂贵计算放入过渡,输入状态同步更新保持即时反馈。对超大数据集结合分页与虚拟列表,避免过渡时间过长。使用 `role="status"` 提示挂起状态,兼顾可访问性。验证与指标React:19.0+;Next.js:15.0+输入无明显卡顿;列表更新平滑,挂起提示清晰

发表评论 取消回复