1. 状态管理在 Android 与 React Native 中的对应
在 Android 开发中,状态管理经历了从传统的 MVP (Presenter 保存状态) 到 MVVM (ViewModel + LiveData / StateFlow),再到如今配合 Compose 使用的单向数据流 (MVI)。
在 React Native 中,状态管理同样经历了一场演进。对于从 Compose 过来的开发者,最好将 RN 的状态管理类比为 Compose 中的 State 或者 ViewModel 里的 StateFlow。
2. 传统霸主:Redux
Redux 是 React 生态中最老牌、最正统的状态管理库。
Redux 的核心概念
- Store: 全局唯一的数据源 (类似全局单例的 ViewModel 存放所有 State)。
- Action: 描述发生了什么 (类似 MVI 中的 Intent/Event)。
- Reducer : 接收旧状态和 Action,返回新状态 (类似 MVI 中的 Reducer,通常是一个庞大的
when或switch语句)。
为什么我们觉得 Redux 太重了?
- 样板代码极多 :为了改一个简单的布尔值,你需要写 Action Type、Action Creator、Reducer,然后绑定到组件上。这比写一个
MutableStateFlow繁琐十倍。 - 心智负担重:对于 Android 开发者来说,仅仅为了跨页面共享一个状态就要引入这么一套庞大的"单向数据流"哲学,显然是杀鸡用牛刀。
3. 轻量级新星:Zustand
Zustand(德语"状态")是目前 React 生态中最受欢迎的轻量级状态管理库之一。
Zustand 为什么更适合现代 RN 开发?
- 极简 API:不需要 Provider,不需要 Reducer,直接创建一个 hook 就可以用。
- 非常像 Kotlin 的单例 + StateFlow:在 Zustand 中,状态和修改状态的方法写在一起,非常直观。
示例对比
Android (Kotlin + StateFlow) :
kotlin
object UserStore {
private val _user = MutableStateFlow<User?>(null)
val user = _user.asStateFlow()
fun login(newUser: User) {
_user.value = newUser
}
}
// 在 Compose 中使用
val user by UserStore.user.collectAsState()
React Native (Zustand) :
javascript
import { create } from 'zustand'
const useUserStore = create((set) => ({
user: null,
login: (newUser) => set({ user: newUser }),
}))
// 在组件中使用
const user = useUserStore((state) => state.user)
const login = useUserStore((state) => state.login)
可以看出,Zustand 的写法几乎和 Kotlin 中定义一个带状态的单例一样简单,但它能自动触发 React 组件的重新渲染,而不需要手动 collectAsState。
4. 总结
对于 Android 开发者转型 RN,强烈建议直接跳过 Redux,使用 Zustand。它的心智模型更接近于我们在 Android 中习惯的基于 ViewModel 和 StateFlow 的状态共享,能够极大地提升开发效率。