AI 性能异常检测系统:用 Transformer 替代阈值告警的生产验证报告
2026/7/22 10:26:49
@[toc]
回头看 RN 项目里所有卡顿严重的列表,你会发现它们几乎都有一个共同点:
状态没有边界。
不是 FlatList 写错了,不是 memo 没加,而是——
你根本不知道:哪些状态,正在影响哪些 item。
我们先不解释,直接给结论。
在 RN 列表里,所有状态都应该被强制放进这 4 个区:
┌─────────────────────────┐ │ 全局业务态 │ Redux / Query │ 用户信息 / 接口数据 │ └─────────────────────────┘ ┌─────────────────────────┐ │ 页面结构态 │ useState / Store │ 排序 / 过滤 / Tab │ └─────────────────────────┘ ┌─────────────────────────┐ │ Item 交互态 │ local / atom / selector │ 点赞 / 选中 / 展开 │ └─────────────────────────┘ ┌─────────────────────────┐ │ 瞬时表现态 │ useSharedValue │ 动画 / 手势 / 滑动 │ └─────────────────────────┘任何一个状态放错区,都会产生渲染扩散。
在 Web 项目里,你可能会觉得:
“多 render 几次也没啥”
但在 RN 里:
RN 是一个对状态错误极度敏感的环境。
一个 Feed 列表,每一条都有:
function FeedPage() { const [likedMap, setLikedMap] = useState({}) const [expandedMap, setExpandedMap] = useState({}) const [playingId, setPlayingId] = useState(null) return ( <FlatList data={list} renderItem={({ item }) => ( <Item item={item} liked={likedMap[item.id]} expanded={expandedMap[item.id]} playing={playingId === item.id} /> )} /> ) }功能 OK,性能隐患巨大。
我们拆解一次点赞发生时的链路:
哪怕只有一个 item 状态变化
你可能会说:
const Item = memo(...)但注意:
memo 只能减少最后一层,
挡不住前面的雪崩。
我们按分区图重写。
// list 数据本身constfeedList=useSelector(...)特点:
const [activeTab, setActiveTab] = useState('hot')特点:
function Item({ item }) { const [liked, setLiked] = useState(false) const [expanded, setExpanded] = useState(false) return ... }或者:
const liked = useStore(s => s.likedMap[item.id])特点:
const scale = useSharedValue(1)特点:
const LikeContext = createContext({}) function Page() { const [likedMap, setLikedMap] = useState({}) return ( <LikeContext.Provider value={{ likedMap, setLikedMap }}> <FlatList ... /> </LikeContext.Provider> ) }const { likedMap, setLikedMap } = useContext(LikeContext)结果是:
任意一次点赞 = 所有 item 全部重绘
const LikeContext = createContext(null) function Item({ id }) { const liked = useContextSelector( LikeContext, v => v.likedMap[id] ) }但注意:
如果你已经写到这里,
Zustand / Jotai 通常更简单。
你在 Review RN 列表代码时,只问 4 个问题:
答不上来,基本必有性能坑。
你会发现:
这也是为什么:
RN 项目写顺了,回去写 Web,代码会自动变干净。
如果你只记住一句:
RN 列表的性能,本质是“状态传播半径”的控制能力。
FlatList 只是放大镜,
状态分区才是解法。