news 2026/4/23 9:24:52

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/23 9:27:59

原神帧率解锁工具使用指南:告别卡顿,畅享丝滑游戏体验

原神帧率解锁工具使用指南&#xff1a;告别卡顿&#xff0c;畅享丝滑游戏体验 【免费下载链接】genshin-fps-unlock unlocks the 60 fps cap 项目地址: https://gitcode.com/gh_mirrors/ge/genshin-fps-unlock 作为一名原神资深玩家&#xff0c;我曾经也深受60帧限制的困…

作者头像 李华
网站建设 2026/4/23 13:19:04

DS4Windows终极配置手册:10分钟让PS4手柄在PC上完美运行

DS4Windows是一款强大的开源工具&#xff0c;能够将PlayStation 4控制器完美映射到Windows系统&#xff0c;让您的PS4手柄在PC游戏中获得原生Xbox控制器般的兼容性。无论您是游戏新手还是资深玩家&#xff0c;本指南都将帮助您快速掌握从基础连接到高级配置的全流程。 【免费下…

作者头像 李华
网站建设 2026/4/23 9:54:52

Fansly下载器完整指南:5步实现高效批量下载

Fansly下载器完整指南&#xff1a;5步实现高效批量下载 【免费下载链接】fansly-downloader Easy to use fansly.com content downloading tool. Written in python, but ships as a standalone Executable App for Windows too. Enjoy your Fansly content offline anytime, a…

作者头像 李华
网站建设 2026/4/23 9:57:53

Cowabunga Lite:解锁iOS定制新境界的终极工具

Cowabunga Lite&#xff1a;解锁iOS定制新境界的终极工具 【免费下载链接】CowabungaLite iOS 15 Customization Toolbox 项目地址: https://gitcode.com/gh_mirrors/co/CowabungaLite 还记得那些年被苹果"锁死"的iPhone吗&#xff1f;想要换个图标、改个状态…

作者头像 李华
网站建设 2026/4/23 9:54:23

多平台直播录制工具使用指南

想轻松录制各大直播平台的精彩内容吗&#xff1f;DouyinLiveRecorder这款基于FFmpeg的录制工具&#xff0c;能够帮你实现60多个主流平台的自动录制。无论你是想保存喜欢的直播回放&#xff0c;还是需要长期监控特定主播的开播情况&#xff0c;这款工具都能满足你的需求。 【免费…

作者头像 李华
网站建设 2026/4/23 11:21:01

超详细版NX二次开发中菜单插件编写示例

NX二次开发实战&#xff1a;手把手教你打造自己的菜单插件你有没有遇到过这样的场景&#xff1f;在NX里反复做着同样的建模操作——创建孔、倒角、打螺纹&#xff0c;一遍又一遍。明明是标准化的设计流程&#xff0c;却要靠工程师手动完成&#xff0c;效率低还容易出错。如果你…

作者头像 李华