网易首页 > 网易号 > 正文 申请入驻

Zustand入门:React Native状态管理的正确用法

0
分享至


一、Zustand 是什么,适合什么场景

Zustand是一个轻量级、基于 hooks 的状态管理库,核心特点是:

  • 无 Provider(无需 Context 包裹)

  • API 极简(create + hooks)

  • 按需订阅(避免无关组件重渲染)

  • 对 React Native 友好(无额外平台依赖)

  • 可渐进式引入

非常适合以下 RN 场景:

  • 中小规模应用

  • RN Hybrid / Module 化工程

  • UI 状态 + 业务状态混合管理

  • 替代部分 Redux 的场景

二、安装

yarn add zustand
# 或
npm install zustand

React Native 无需额外配置。

三、最基础用法(核心必会) 1. 创建 Store

// store/useCounterStore.ts
import { create } from 'zustand';

type CounterState = {
count: number;
inc: () => void;
dec: () => void;
};

export const useCounterStore = create ((set) => ({
count: 0,
inc: () => set((state) => ({ count: state.count + 1 })),
dec: () => set((state) => ({ count: state.count - 1 })),
}));
2. 在组件中使用

import React from 'react';
import { View, Text, Button } from 'react-native';
import { useCounterStore } from './store/useCounterStore';

export default function Counter() {
const count = useCounterStore((state) => state.count);
const inc = useCounterStore((state) => state.inc);

return (

Count: {count}

);
}
关键点
  • selector 模式useStore(state => state.xxx)

  • 只订阅使用到的字段,避免全量刷新

四、推荐的工程化写法(重要) ❌ 不推荐

const store = useStore();

这样会导致任意状态变更都触发重渲染

✅ 推荐:拆分 selector

const count = useCounterStore((s) => s.count);
const inc = useCounterStore((s) => s.inc);

或:

const { count, inc } = useCounterStore(
(s) => ({ count: s.count, inc: s.inc })
);
五、Zustand 在 React Native 中的常见模式 1. 全局 UI 状态(Loading / Modal)

type UIState = {
loading: boolean;
showLoading: () => void;
hideLoading: () => void;
};


export const useUIStore = create ((set) => ({
loading: false,
showLoading: () => set({ loading: true }),
hideLoading: () => set({ loading: false }),
}));

const loading = useUIStore((s) => s.loading);
2. 业务状态(登录信息)

type User = {
id: string;
name: string;
};

type AuthState = {
user?: User;
login: (u: User) => void;
logout: () => void;
};

export const useAuthStore = create ((set) => ({
user: undefined,
login: (user) => set({ user }),
logout: () => set({ user: undefined }),
}));
3. 异步 Action(非常自然)

type ListState = {
list: string[];
loading: boolean;
fetchList: () => Promise;
};


export const useListStore = create ((set) => ({
list: [],
loading: false,
fetchList: async () => {
set({ loading: true });
const res = await fetch('https://example.com/list');
const data = await res.json();
set({ list: data, loading: false });
},
}));

RN 中无需 thunk / saga。

六、性能优化(RN 场景非常关键) 1. 使用 shallow 避免对象对比

import { shallow } from 'zustand/shallow';


const { count, inc } = useCounterStore(
(s) => ({ count: s.count, inc: s.inc }),
shallow
);
2. 将高频 UI 状态拆分 Store

store/
├── useAuthStore.ts
├── useUIStore.ts
├── useListStore.ts

避免一个大 Store。

七、持久化(AsyncStorage) RN 常用:zustand + persist

import { create } from'zustand';
import { persist } from'zustand/middleware';
import AsyncStorage from'@react-native-async-storage/async-storage';


exportconst useAuthStore = create(
persist(
(set) => ({
token: '',
setToken: (token: string) =>set({ token }),
clearToken: () =>set({ token: '' }),
}),
{
name: 'auth-storage',
storage: {
getItem: AsyncStorage.getItem,
setItem: AsyncStorage.setItem,
removeItem: AsyncStorage.removeItem,
},
}
)
);
八、Zustand vs Redux Toolkit(RN 实战视角)

维度

Zustand

Redux Toolkit

学习成本

极低

样板代码

极少

Provider

不需要

必须

异步

原生支持

thunk / saga

DevTools

大型团队

一般

更适合

个人建议

  • RN 业务页面、模块级状态:Zustand

  • 复杂全局状态、多人协作:RTK

  • 二者可以共存

九、常见坑位总结
  1. 不要整 store 订阅

  2. 不要把所有状态塞进一个 store

  3. RN 中慎用大对象(列表分页要拆分)

  4. persist + AsyncStorage 要注意冷启动恢复时机

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
高市早苗与到访的李在明打起架子鼓 卖力迎合

高市早苗与到访的李在明打起架子鼓 卖力迎合

看看新闻Knews
2026-01-14 12:29:11
美专家罕见达成一致:一旦台湾回归中国,美国可能就剩1条路可走

美专家罕见达成一致:一旦台湾回归中国,美国可能就剩1条路可走

兴史兴谈
2026-01-13 08:03:38
她是华为的救命恩人,为华为创收5000亿,任正非都不敢直呼她大名

她是华为的救命恩人,为华为创收5000亿,任正非都不敢直呼她大名

墨兰史书
2026-01-03 03:50:02
贪污上亿、假慈善?被实名举报的韩红,明白她终身不嫁的原因

贪污上亿、假慈善?被实名举报的韩红,明白她终身不嫁的原因

泠泠说史
2025-11-27 18:18:02
在伊朗华商:这一次,伊朗非死不可!为什么伊朗“非死不可”?

在伊朗华商:这一次,伊朗非死不可!为什么伊朗“非死不可”?

黑翼天使
2026-01-14 06:09:59
原来他是梁天儿子,出身北大世家是北大高才生,如今成父亲的骄傲

原来他是梁天儿子,出身北大世家是北大高才生,如今成父亲的骄傲

做一个合格的吃瓜群众
2026-01-14 13:38:00
交警私下透露:车险千万别买全险,只买这2样,每年省下2000块!

交警私下透露:车险千万别买全险,只买这2样,每年省下2000块!

老特有话说
2026-01-12 12:42:49
1984年,黄克诚拍桌子大骂:要是他一无是处,那他怎么当的元帅?

1984年,黄克诚拍桌子大骂:要是他一无是处,那他怎么当的元帅?

小豫讲故事
2026-01-14 06:00:08
今晚U23国足决战泰国,赛前名嘴黄健翔给国足支招,句句说到点上

今晚U23国足决战泰国,赛前名嘴黄健翔给国足支招,句句说到点上

零度眼看球
2026-01-14 13:48:19
北京这一夜:王楚钦引全场尖叫,被金晨的嘴吓到,巩俐生图赢麻了

北京这一夜:王楚钦引全场尖叫,被金晨的嘴吓到,巩俐生图赢麻了

娱乐圈笔娱君
2026-01-14 11:26:56
殷桃两套大片美出圈!深V性感与浅蓝清新切换,46岁身材状态绝了

殷桃两套大片美出圈!深V性感与浅蓝清新切换,46岁身材状态绝了

章眽八卦
2025-12-20 12:29:42
外媒首次承认:中国核潜艇数量已超俄罗斯,096更将改变力量格局

外媒首次承认:中国核潜艇数量已超俄罗斯,096更将改变力量格局

科普100克克
2026-01-13 17:50:52
特朗普表示可能会对伊朗采取非常强硬的行动,外交部回应

特朗普表示可能会对伊朗采取非常强硬的行动,外交部回应

环球网资讯
2026-01-14 15:32:32
回顾许家印被抓捕现场,奋力反抗,怒吼不已,被抓捕人员抬出去

回顾许家印被抓捕现场,奋力反抗,怒吼不已,被抓捕人员抬出去

干史人
2026-01-08 22:47:00
华夏幸福开盘跌停

华夏幸福开盘跌停

每日经济新闻
2026-01-14 09:35:35
双汇创始人万隆:出轨女秘书20年,给美国输送35亿,却被儿子揭发

双汇创始人万隆:出轨女秘书20年,给美国输送35亿,却被儿子揭发

揽星河的笔记
2026-01-14 15:40:58
特朗普对华加税25%,中国强硬反击令世界吃惊

特朗普对华加税25%,中国强硬反击令世界吃惊

潘軮旅行浪子
2026-01-13 20:01:13
小学阶段,有这些表现的孩子,就证明不是读书的料了

小学阶段,有这些表现的孩子,就证明不是读书的料了

好爸育儿
2026-01-13 16:17:52
陪睡陪玩是冰山一角?又一女演员曝内娱潜规则,原来岳云鹏没说谎

陪睡陪玩是冰山一角?又一女演员曝内娱潜规则,原来岳云鹏没说谎

丰谭笔录
2026-01-14 07:05:08
金惠景陪李在明出席晚宴全程冷脸,高市早苗和李在明尽情畅欢颜

金惠景陪李在明出席晚宴全程冷脸,高市早苗和李在明尽情畅欢颜

斜烟风起雨未
2026-01-14 09:44:12
2026-01-14 16:07:00
君伟说
君伟说
分享职场故事
360文章数 48关注度
往期回顾 全部

科技要闻

美国批准英伟达H200卖给中国,但有条件

头条要闻

电车失控在市区以超100km/h时速连撞15车 阿维塔回应

头条要闻

电车失控在市区以超100km/h时速连撞15车 阿维塔回应

体育要闻

牛津学霸买下儿时主队,让它成为英超黑马

娱乐要闻

何晴去世30天,许亚军终于发声

财经要闻

姚振华举报:观致汽车资产被低价拍卖

汽车要闻

曝Model Y或降到20万以内!

态度原创

数码
手机
艺术
本地
公开课

数码要闻

惠科全球首发36.5英寸8K Mini LED显示器,峰值亮度1800nits

手机要闻

首款真全面屏iPhone!苹果折叠屏iPhone Fold渲染图出炉

艺术要闻

八大山人『山水花鸟册』

本地新闻

穿越鳌太线,怎么就成了户外人的致命诱惑?

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版