使用 Zustand 简化 React Native 中的状态管理

使用 zustand 简化 react native 中的状态管理

状态管理是现代应用程序开发的一个重要方面,在 react native 中,有效管理状态可以显着提高应用程序的性能和可维护性。 zustand 是 react 的简约状态管理库,为处理 react native 应用程序中的状态提供了一个优雅而简单的解决方案。在本博客中,我们将探讨 zustand、它的工作原理以及为什么它可能是您的 react native 项目的正确选择。

祖斯坦是什么?

zustand 是一个小型、快速且可扩展的 react 应用程序状态管理解决方案。它的名称源自德语中的“国家”一词,反映了其主要功能:有效管理国家。 zustand 因其简单性和易用性而脱颖而出,允许您使用最少的样板代码创建状态存储。

zustand的主要特点

最小 api:zustand 提供了一个简单的 api,使状态管理变得直观、简单。无提供程序组件:与其他状态管理库不同,zustand 不需要提供程序组件,这可以简化您的组件树。反应性:zustand 与 react 的内置钩子无缝集成,使其反应灵敏且高效。中间件支持:zustand 支持中间件以增强功能,例如持久性和日志记录。

zustand 入门

1. 安装

首先,您需要在 react native 项目中安装 zustand。打开终端并运行:

npm install zustand

yarn add zustand

2. 创建商店

zustand 使用存储来管理状态。 store 是一个 javascript 对象,它保存状态并提供更新它的方法。

在 zustand

一套)
目的:更新您商店的状态。
它是如何工作的:您可以使用它来修改状态。您提供一个接收当前状态并返回新状态的函数。

b) 得到
目的:读取商店的当前状态。
工作原理:您可以使用它来访问当前状态以进行阅读或做出决策。

这是创建 zustand 商店和使用的简单示例:

mystore1.jsx

import create from 'zustand';// create the storeconst mystore1 = create((set, get) => ({    items: [], // initial state    // action to fetch items from an api    fetchitems: async () => {        try {            const response = await fetch('https://api.example.com/items'); // replace with your api url            const data = await response.json();            set({ items: data });        } catch (error) {            console.error('failed to fetch items:', error);        }    },    // action to add an item    additem: (item) => set((state) => ({        items: [...state.items, item],    })),    // action to remove an item    removeitem: (id) => set((state) => ({        items: state.items.filter(item => item.id !== id),    })),    // action to get the count of items    getitemcount: () => get().items.length,}));export default mystore1;

用法:
应用程序.jsx

import react, { useeffect } from 'react';import { view, text, button, flatlist, stylesheet } from 'react-native';import mystore1 from './mystore1'; // adjust the path to where your store file is locatedconst app = () => {    // destructure actions and state from the store    const { items, fetchitems, additem, removeitem, getitemcount } = mystore1();    // fetch items when the component mounts    useeffect(() => {        fetchitems();    }, [fetchitems]);    const handleadditem = () => {        const newitem = { id: date.now(), name: 'new item' };        additem(newitem);    };    const handleremoveitem = (id) => {        removeitem(id);    };    return (                    item list ({getitemcount()})            

在此示例中:

create 是 zustand 中的一个函数,用于初始化商店。set是zustand提供的更新商店的功能。count 是由 store 管理的一段状态。增加和减少是修改状态的操作。get是读取store当前的状态mystore1 我们使用钩子来获取当前状态值和操作函数。

高级用法

1. 中间件

zustand 支持中间件以增强其功能。例如,您可以使用持久中间件从 asyncstorage/mmkv 保存和加载状态:

a) zustand 与 react native 异步存储

usescansstore.jsx

import asyncstorage from '@react-native-async-storage/async-storage';import { create } from 'zustand';import { persist, createjsonstorage } from 'zustand/middleware';// create the storeexport const usescansstore = create()(    persist(        (set, get) => ({            fishes: 0, // initial state            addafish: () => set({ fishes: get().fishes + 1 }) // function to update state        }),        {            name: "food-storage", // key used to store the data            storage: createjsonstorage(() => asyncstorage), // use asyncstorage for persistence        }    ));

b) zustand 与 mmkv

i) 创建mmkv配置文件storage.jsx

import { mmkv } from "react-native-mmkv";export const storage = new mmkv({    id: 'my-app-storage',    encryptionkey: 'some_encryption_key'})export const mmkvstorage = {    setitem: (key, value) => {        storage.set(key, value)    },    getitem: (key) => {        const value = storage.getstring(key)        return value ?? null    },    removeitem: (key) => {        storage.delete(key)    },}

ii)usescansstore.jsx

import { create } from 'zustand';import { persist, createJSONStorage } from 'zustand/middleware';import mmkvStorage from './mmkvStorage'; // Import the MMKV storage configuration// Create the storeexport const useScansStore = create()(    persist(        (set, get) => ({            fishes: 0, // Initial state            addAFish: () => set({ fishes: get().fishes + 1 }) // Function to update state        }),        {            name: "food-storage", // Key used to store the data            storage: createJSONStorage(() => mmkvStorage), // Use MMKV for persistence        }    ));

最佳实践

保持商店规模较小:为了保持清晰和简单,请保持 zustand 商店集中且规模较小。如果您的商店变得太大,请考虑将其分成较小的模块化商店。明智地使用中间件:仅在必要时使用中间件。它会增加复杂性和开销,因此请根据您的需求进行应用。利用 react native 的 hooks:zustand 与 react 的 hooks 很好地集成,因此可以利用 useeffect 和 usecallback 等钩子来管理副作用并优化性能。

结论

zustand 为 react native 应用程序中的状态管理提供了一种简约且高效的方法。其简单的 api、反应性和中间件支持使其成为管理小型和大型项目状态的绝佳选择。通过遵循本博客中概述的示例和最佳实践,您可以将 zustand 无缝集成到您的 react native 应用程序中,并享受更干净、更可维护的状态管理解决方案。

相关帖子:https://dev.to/ajmal_hasan/react-native-mmkv-5787https://dev.to/ajmal_hasan/reactotron-setup-in-react-native-redux-applications-4jj3

以上就是使用 Zustand 简化 React Native 中的状态管理的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1490984.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月19日 13:36:04
下一篇 2025年12月19日 13:36:21

相关推荐

  • 获取免费的 Nextjs SaaS 登陆页面模板!

    您正在推出新的 saas 产品或需要为您的登陆页面焕然一新吗?我为您准备了一些东西 — 免费的 next.js saas 登陆页面模板已准备就绪! 简洁的设计 谁可以使用它? 初创公司:通过专业的登陆页面推出您的产品。开发人员:使用现成的、干净编码的模板节省时间。营销人员:通过精心设计的着陆页来推动…

    好文分享 2025年12月19日
    000
  • 文档的力量:阅读如何改变我在 JamSphere 上使用 Redux 的体验

    作为开发人员,我们经常发现自己一头扎进新的库或框架,渴望将我们的想法变为现实。跳过文档并直接跳到编码的诱惑很强烈——毕竟,这有多难呢?但正如我通过构建 JamSphere(音乐管理平台)的经验所了解到的那样,跳过这关键的一步可能会将顺利的旅程变成充满挑战的艰苦战斗。 跳过文档的魅力 当我开始从事 J…

    2025年12月19日
    000
  • 横幅生成器

    您最近发帖时是否发现自己没有横幅?嗯,这也发生在我身上。我确实找到了一些发电机,但我确实喜欢将其全部保留在内部的想法。 不,我不是指私人横幅生成器。事实上,您知道我们自己的一位 dev.to 作家一年前的作品吗? Christopher Kade 制作了一款允许使用文本、表情符号、背景颜色和边框的产…

    2025年12月19日
    000
  • UI 阻塞行为:微任务与宏任务

    你能找出下面两个代码片段的区别吗: function handleclick1() { settimeout(handleclick1, 0);}function handleclick2() { promise.resolve().then(handleclick2);} 如果您无法确定选择其中一…

    2025年12月19日
    000
  • 有关 SQL 基础知识的博客

    SQL 基础知识:基本介绍结构化查询语言(SQL)是管理和操作关系数据库的强大工具。如果您是 SQL 新手,了解其基础知识可以开启处理数据的无限可能。以下是您开始使用时需要了解的内容的快速概述。 什么是 SQL? SQL 是一种用于与关系数据库交互的标准化语言。它允许您执行各种操作,例如检索数据、添…

    2025年12月19日
    000
  • 如何使用 Electronjs 创建跨平台桌面应用程序

    在当今的软件开发环境中,构建跨不同操作系统无缝运行的应用程序比以往任何时候都更加重要。无论您的目标是 windows、macos 还是 linux,electron.js 都提供了一个强大的框架,可以使用熟悉的 web 技术创建桌面应用程序。本文将指导您完成设置 electron 环境、创建应用程序…

    2025年12月19日
    000
  • JavaScript 中的日变量:通过实际示例了解 `const`、`let` 和 `var`

    当您使用 javascript 时,您首先要学习的事情之一就是如何声明变量。变量就像存储信息的容器,例如数字、文本甚至复杂数据。在 javascript 中,声明变量有三种方式:const、let 和 var。其中每一个都有自己的规则和最佳实践,一开始可能会有点令人困惑。在这篇文章中,我们将通过简单…

    2025年12月19日
    000
  • 发布 f `@xmldom/xmldom`

    语境 xmldom 是一个 javascript ponyfill,用于向其他运行时提供现代浏览器中存在的以下 api:将 xml 字符串转换为 dom 树 new domparser().parsefromstring(xml, mimetype) => document创建、访问和修改 d…

    2025年12月19日
    000
  • 游戏开发的未来(没有引擎!?)

    您无需等待游戏开发者设计关卡、角色或动作。 ?‍♂️ 相反,游戏会在你玩的过程中自动生成! 这可能听起来像科幻小说,但由于谷歌开发的一项新技术,它正在成为现实。 ?‍♂️ 这个新的游戏引擎,称为“Game and Gen”使用人工智能(AI)来动态创建游戏世界。 ? 你不需要任何传统的编码来制作关卡…

    2025年12月19日 好文分享
    000
  • JavaScript 中的 `forin` 与 `forof`:

    数据在医疗保健中发挥着至关重要的作用。从跟踪生命体征到分析性能指标,临床医生经常依靠算法来筛选大量数据。在 javascript 中,使用 for…in 和 for…of 之间的选择会影响这些算法的运行效率,尤其是在处理可枚举属性和大型数据集时。 基础知识:for&#8230…

    2025年12月19日
    000
  • GoMock 简介:Go 中的 Mocking

    在软件开发中,测试是确保代码质量和可靠性的关键方面。然而,在编写测试时,您经常会遇到需要单独测试组件的情况,而不受其依赖项的影响。这就是模拟发挥作用的地方,对于 go 开发人员来说,gomock 是为此目的使用最广泛的框架之一。在本文中,我们将探索 gomock,一个强大的 go (golang) …

    2025年12月19日
    000
  • 设置您的开发环境 – ReactJS

    欢迎来到“reactjs 30 天”挑战的第二天!今天,我们将设置您的开发环境以开始构建 react 应用程序。我们今天选择的工具将使您的开发过程更加顺畅和高效。 为什么设置正确的环境很重要 在深入代码之前,有一个正确配置的环境至关重要。想象一下你要烤一个蛋糕。在开始混合配料之前,您需要确保拥有所有…

    2025年12月19日
    000
  • JavaScript 与 TypeScript

    javascript (js) 长期以来一直是现代 web 开发的支柱。随着 web 应用程序的复杂性不断增加,对更好工具的需求变得显而易见,尤其是在类型安全性和代码可维护性方面。这就是 javascript 超集 typescript (ts) 发挥作用的地方。让我们深入研究 typescript…

    2025年12月19日
    000
  • 在 React 应用程序中实现简单的页面视图跟踪器

    简介: 了解用户参与度对于任何 web 应用程序都至关重要,而要跟踪的最简单的指标之一就是页面浏览量。在这篇博文中,我们将逐步介绍在 react 应用程序中实现基本页面视图跟踪器的过程,包括如何使用 postman 和 curl 命令获取服务的 api 密钥。 第 1 步:设置你的 react 项目…

    2025年12月19日
    000
  • jsDoc npm 模块任务

    目前我正在工作/维护遗留的 js/react 应用程序,没有办法重新工作到 typesript,这就是为什么我打开 jsdoc 作为 js 现有的开发时类型系统。 太长了; typescript npm 模块由 jsdoc 制作,useduck 在 70loc 下带回了 redux 的黄金时代。该模…

    2025年12月19日
    000
  • 正在寻找 4 中的开源 Google Analytics 替代品?

    如果您是开发人员,您可能已经花了一些时间寻找合适的分析工具。我们在你之前做到了!大多数人默认使用 Google Analytics,但它并不总是完美的选择,特别是如果您担心设置复杂性、隐私、持续支持(作为小团队)或定制。 今天我们向您介绍 Litlyx,它是 Google Analytics 的开源…

    2025年12月19日
    000
  • 前端框架的隐性成本

    我们都希望我们的网站看起来有吸引力,并且在多种设备和屏幕尺寸上感觉快速且响应灵敏。前端生态系统中开发了一些常用工具来帮助构建此类界面。 最常见和众所周知的是 react,还有许多其他人共享这个空间,例如 svelte、solidjs、angular、vue、qwik 等。所有这些都是令人印象深刻的工…

    2025年12月19日
    000
  • 中间件的类型:不同的风格

    读完上一篇文章后,让我们看看 expressjs 中的中间件类型,中间件有不同的风格(?),每种都有独特的用途: 1。应用级中间件: 这就像主要成分。您将其添加到整个应用程序中,它会根据每个请求运行。? app.use((req, res, next) => { console.log(‘th…

    2025年12月19日
    000
  • Redux 与 ContextProvider:在 React 应用程序中选择状态管理

    长话短说 当您需要一个强大且可扩展的解决方案来进行复杂的状态管理时,请使用 redux,特别是在具有许多组件与状态交互的大型应用程序中。当你的状态管理需求更简单、更本地化,或者当你想避免小型应用程序中 redux 的开销时,请使用 context.provider。 让我们开始吧 在 react 或…

    2025年12月19日
    000
  • 代码日/日:反思箭头函数

    2024 年 8 月 28 日,星期三 当我完成 14 个迷你项目时,在完成猜数字游戏之前还有一项作业。在整个旅程中,我发现人工智能对于获取有关我的编码风格的反馈非常有帮助。 我有一个关于编写函数的问题,因为当有机会时我通常会编写箭头函数,因为在我上一份工作中,箭头函数是常态,尤其是在技术展示期间。…

    2025年12月19日
    000

发表回复

登录后才能评论
关注微信