调试与优化:smart-cloud接口日志与SQL日志切面打印技巧
2026/8/10 20:01:59
setTimeout / debounce = 时间层面的延迟
startTransition = UI 优先级 & 可中断调度
它们解决的是完全不同的问题。
| 维度 | setTimeout | debounce | startTransition |
|---|---|---|---|
| 本质 | JS 定时器 | JS 定时策略 | React 调度语义 |
| 是否理解 UI | ❌ | ❌ | ✅ |
| 是否可中断 | ❌ | ❌ | ✅ |
| 是否降低计算次数 | ❌ | ✅ | ❌ |
| 是否防抖 | ❌ | ✅ | ❌ |
| 是否解决卡输入 | ❌ | ⚠️ 部分 | ✅ |
| React 推荐 | ❌ | ⚠️ | ✅ |
setTimeout(()=>{setList(filter(data))},0)输入 ↓ JS 空闲 ↓ setTimeout callback 开始 ↓ filter(data) 占满 500ms ↓ 输入仍然卡它只是换了个时间点卡你
constdebouncedFilter=debounce((v)=>{setList(filter(data,v))},300)“你别每次都算”
filter(data)仍然是同步的debounce = 减少次数,不是让 UI 优先
| 场景 | 是否合适 |
|---|---|
| 请求接口 | ✅ |
| 自动保存 | ✅ |
| 搜索接口 | ✅ |
| 本地大计算 | ❌ |
startTransition(()=>{setList(filter(data))})React 在内部标记:
“这次更新可以被打断”
然后:
filter 开始 ↓ 500ms 主线程占满 ↓ 输入卡filter 执行一部分 ↓ 用户输入 ↓ React 中断 filter ↓ 更新 input ↓ 继续 filter这是本质差异。
startTransition 不会减少计算量
filter(data)// 还是会算它只是:
constonChange=debounce((value)=>{startTransition(()=>{setList(filter(data,value))})},200)既少算,又不卡
startTransition(()=>{debounce(()=>setList(...),300)()})完全没意义。
输入 → 表格过滤 → 10000 行
| 问题 | 答案 |
|---|---|
| 每次输入都要算吗? | ❌ |
| 能不能晚点算? | ✅ |
| 用户在 input 框输入必须立即显示文字吗? | ✅ |
debounce + startTransition
因为:
JS 时间工具(setTimeout / debounce)
管“什么时候执行”React 工具(startTransition)
管“谁先执行”
setTimeout:
“等会再卡你”debounce:
“少卡几次”startTransition:
“先让用户动起来”