把搜索框的值提升到页面组件后,输入一个字符整页渲染 200ms,输入法候选框都卡。原本输入很跟手。乍看像缓存或者权限的锅,追下去往往不是。

const deferred = useDeferredValue(keyword);
const rows = useMemo(() => filter(deferred), [deferred, all]);
<Table columns={columns} rows={rows} />

追下去是这么回事:状态放在页面顶层,每次按键都让整棵子树重新执行,包括 300 行的表格。表格没有 memo,列配置每次都是新建的对象。

「状态提升性能」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。

能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。报错里带路径的,先去看那个路径在不在、权限对不对。

具体做法是,输入框状态留在本地 提交或防抖后再通知父级;表格用 memo 包住 列配置用 useMemo 固定引用;确实要提升就用 useDeferredValue 降低优先级;用 Performance 面板对比按键耗时。

验收就看一点,连续输入十个字符,每次按键耗时降到 30ms 以内,表格在停止输入后更新。

作者 9823189