news 2026/10/29 9:29:01

Redux vs Jotai vs Zustand,在 RN 列表里的真实差异

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Redux vs Jotai vs Zustand,在 RN 列表里的真实差异

@[toc]

如果你做过 RN 列表,一定经历过这种阶段:

  1. 刚开始:useState挺顺
  2. 状态多了:开始抽 Redux
  3. 列表卡了:疯狂 memo / useCallback
  4. 还是卡:开始怀疑人生

问题真的在 FlatList 吗?
大多数时候,在状态模型。

统一测试场景

为了公平,我们先约定一个非常常见的场景:

  • 一个商品列表(100 条)
  • 每一项可以点赞
  • 点赞状态会影响 UI
  • 不考虑网络,只看本地状态更新

Redux:全局广播型

典型写法

function List() { const likedMap = useSelector(state => state.likedMap) return ( <FlatList data={data} renderItem={({ item }) => ( <Item item={item} liked={likedMap[item.id]} /> )} /> ) }

一次点赞发生了什么?

我们不讲概念,直接讲链路:

  1. dispatch
  2. reducer 返回新 likedMap
  3. useSelector 命中
  4. List 重新 render
  5. FlatList 重新计算 renderItem
  6. 所有 Item 重新走 props 对比

哪怕你:

  • memo 了 Item
  • useCallback 了 renderItem

List 这一层,永远逃不掉。

Redux 的本质问题

状态变化是“广播式”的,而列表最怕广播。

Redux 很适合:

  • 页级数据
  • 配置
  • 权限
  • 请求缓存

但它对“高频、局部、交互型状态”是天然不友好的。

Jotai:原子级订阅

我们换成 Jotai。


Atom 定义

constlikedAtom=atom<Record<string,boolean>>({})

Item 组件直接订阅

function Item({ id }) { const [likedMap, setLikedMap] = useAtom(likedAtom) const liked = likedMap[id] return ( <Pressable onPress={() => setLikedMap(prev => ({ ...prev, [id]: !prev[id] })) } > <Text>{liked ? '❤️' : '🤍'}</Text> </Pressable> ) }

看起来好一点,但问题还在

为什么?

因为:

  • likedMap 还是一个大对象
  • atom 的 value 还是整体变化
  • 所有订阅这个 atom 的组件都会更新

Jotai 没有魔法,它只是更细粒度。

正确的 Jotai 用法

关键在这一步:

constlikedAtomFamily=atomFamily((id:string)=>atom(false))
function Item({ id }) { const [liked, setLiked] = useAtom(likedAtomFamily(id)) return ( <Pressable onPress={() => setLiked(v => !v)}> <Text>{liked ? '❤️' : '🤍'}</Text> </Pressable> ) }

现在变化的是:

  • 一个 atom
  • 一个 item
  • 一个订阅者

这时 Jotai 的优势才真正出现。

Zustand:选择器驱动型

Zustand 是 RN 圈里这两年非常受欢迎的状态库。

Store 定义

constuseStore=create(set=>({likedMap:{},toggleLike:(id)=>set(state=>({likedMap:{...state.likedMap,[id]:!state.likedMap[id],},})),}))

Item 级别订阅

function Item({ id }) { const liked = useStore( state => state.likedMap[id] ) const toggleLike = useStore( state => state.toggleLike ) return ( <Pressable onPress={() => toggleLike(id)}> <Text>{liked ? '❤️' : '🤍'}</Text> </Pressable> ) }

Zustand 在这里做对了什么?

重点只有一个:

selector 是订阅边界。

  • likedMap 整体变没关系
  • selector 只关心likedMap[id]
  • 其他 item 不会被通知

这点和 Redux 完全不同。

三者在 RN 列表里的核心差异对比

维度ReduxJotaiZustand
更新模型广播原子订阅选择器订阅
默认粒度全局原子selector
列表友好度低中(需设计)高
心智成本中高低
易踩坑指数高中低

为什么 Zustand 在 RN 圈更“顺手”

不是偶然。

RN 的渲染模型决定了:

  • 谁订阅,谁重渲
  • 渲染成本非常直观
  • 没有浏览器兜底

Zustand 的 selector 模型,天然契合 RN 的这种“显式渲染”。

但 Zustand 也不是银弹

需要注意几个现实问题:

  • store 过大会失控
  • selector 写得不好一样重渲
  • 很多人开始“什么都放 store”

所以记住一句话:

Zustand 是局部状态放大器,不是全局垃圾桶。

一个推荐的组合方案

在真实 RN 项目里,一个非常稳妥的搭配是:

  • Redux:页面数据、接口缓存、权限
  • Zustand / Jotai:列表交互、UI 状态
  • useState:item 内部临时态

这不是“多此一举”,而是按渲染成本分层。

从状态库差异,反推 RN 的本质

你会发现一个很残酷的事实:

RN 不会帮你隐藏状态设计的错误。

Web 项目里还能靠浏览器苟住,
RN 会把每一次设计失误,直接变成卡顿反馈给你。

一句话总结

如果只记一句:

在 RN 列表里,谁能把“谁重渲”控制到最小,谁就赢了。

Redux 赢在秩序,
Jotai 赢在精细,
Zustand 赢在直觉。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/27 9:09:30

SMUDebugTool深度解析:AMD硬件调优的专业级解决方案

SMUDebugTool深度解析&#xff1a;AMD硬件调优的专业级解决方案 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gitc…

作者头像 李华
网站建设 2026/10/28 16:51:08

Emu3.5:20倍速生成!10万亿token的AI多模态神器

导语&#xff1a;BAAI团队推出的Emu3.5多模态大模型凭借10万亿级多模态token训练量和创新加速技术&#xff0c;实现了20倍生成速度提升&#xff0c;重新定义了AI理解与生成视觉-语言内容的能力边界。 【免费下载链接】Emu3.5 项目地址: https://ai.gitcode.com/BAAI/Emu3.5 …

作者头像 李华
网站建设 2026/10/26 7:50:26

模拟电子技术基础教程:电压源与电流源详解

模拟电子技术基础教程&#xff1a;电压源与电流源详解在模拟电路的世界里&#xff0c;电源不是简单的“供电工具”&#xff0c;而是决定系统性能的核心角色。我们每天都在用电池、稳压模块、LDO 给芯片供电&#xff0c;但你是否真正理解&#xff1a;为什么有的电路必须用恒流驱…

作者头像 李华
网站建设 2026/10/28 16:27:27

极速AI绘图新选择:FLUX.1-Krea-dev 4-bit量化版发布

AI图像生成技术迎来效率革命&#xff0c;Nunchaku团队正式发布基于FLUX.1-Krea-dev模型的4-bit量化版本——nunchaku-flux.1-krea-dev。这一优化版本通过创新的SVDQuant量化技术&#xff0c;在保持图像生成质量的同时&#xff0c;显著降低了计算资源需求&#xff0c;为普通用户…

作者头像 李华
网站建设 2026/10/24 21:06:51

sguard_limit:终结腾讯游戏卡顿的终极解决方案

sguard_limit&#xff1a;终结腾讯游戏卡顿的终极解决方案 【免费下载链接】sguard_limit 限制ACE-Guard Client EXE占用系统资源&#xff0c;支持各种腾讯游戏 项目地址: https://gitcode.com/gh_mirrors/sg/sguard_limit 还在为腾讯游戏卡顿掉帧而烦恼吗&#xff1f;&…

作者头像 李华
网站建设 2026/10/29 3:52:13

Jellyfin Android TV终极指南:如何快速搭建你的专属家庭媒体中心

Jellyfin Android TV终极指南&#xff1a;如何快速搭建你的专属家庭媒体中心 【免费下载链接】jellyfin-androidtv Android TV Client for Jellyfin 项目地址: https://gitcode.com/gh_mirrors/je/jellyfin-androidtv 还在为散落在各处的电影、音乐和照片烦恼吗&#xf…

作者头像 李华