news 2026/5/1 6:04:21

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/4/18 7:46:51

如何用AI生成电影级推镜视频?这款LoRA神器来了

如何用AI生成电影级推镜视频&#xff1f;这款LoRA神器来了 【免费下载链接】Motion-Lora-Camera-Push-In-Wan-14B-720p-I2V 项目地址: https://ai.gitcode.com/hf_mirrors/lovis93/Motion-Lora-Camera-Push-In-Wan-14B-720p-I2V 导语&#xff1a;近期&#xff0c;一款名…

作者头像 李华
网站建设 2026/4/24 15:20:47

联发科设备终极修复指南:MTKClient三步操作完整教程

联发科设备终极修复指南&#xff1a;MTKClient三步操作完整教程 【免费下载链接】mtkclient MTK reverse engineering and flash tool 项目地址: https://gitcode.com/gh_mirrors/mt/mtkclient 为什么你的联发科设备突然变砖&#xff1f;如何快速恢复系统功能&#xff1…

作者头像 李华
网站建设 2026/4/28 3:48:56

Jable视频下载全攻略:从零开始掌握流媒体保存技巧

Jable视频下载全攻略&#xff1a;从零开始掌握流媒体保存技巧 【免费下载链接】jable-download 方便下载jable的小工具 项目地址: https://gitcode.com/gh_mirrors/ja/jable-download 还在为Jable平台上的精彩视频无法离线观看而苦恼&#xff1f;现在&#xff0c;一款专…

作者头像 李华
网站建设 2026/4/22 17:35:24

MacType字体渲染优化配置完全指南

MacType字体渲染优化配置完全指南 【免费下载链接】mactype Better font rendering for Windows. 项目地址: https://gitcode.com/gh_mirrors/ma/mactype 还在为Windows系统下模糊的字体显示效果而烦恼吗&#xff1f;作为追求极致视觉体验的用户&#xff0c;你一定希望屏…

作者头像 李华
网站建设 2026/4/30 4:12:18

GPT-OSS-Safeguard:AI内容安全推理新工具

导语&#xff1a;OpenAI推出专注于内容安全推理的开源模型GPT-OSS-Safeguard&#xff0c;以轻量化设计和可定制化策略重新定义AI安全防护标准。 【免费下载链接】gpt-oss-safeguard-120b 项目地址: https://ai.gitcode.com/hf_mirrors/openai/gpt-oss-safeguard-120b 行…

作者头像 李华
网站建设 2026/4/23 12:35:18

微软UserLM-8b:打造更真实对话的AI用户模拟器

微软UserLM-8b&#xff1a;打造更真实对话的AI用户模拟器 【免费下载链接】UserLM-8b 项目地址: https://ai.gitcode.com/hf_mirrors/microsoft/UserLM-8b 微软研究院近日发布了一款专注于模拟用户角色的新型语言模型UserLM-8b&#xff0c;该模型打破传统大语言模型以&…

作者头像 李华