一分钟实现,一个 RN 持久数据管理器 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
rufeng008
V2EX    程序员

一分钟实现,一个 RN 持久数据管理器

  •  
  •   rufeng008 2020-05-09 10:15:53 +08:00 1295 次点击
    这是一个创建于 1984 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在 React Native 开发过程中,总避免不了需要存储一些数据在本地。对于大多数应用只需要存储一些结构简单的数据,如标记位,用户信息等。这时候我们首选择的存储方式就是 AsyncStorage,那我们先来看下 AsyncStorage 给我提供了哪些基本方法:

    AsyncStorage_methods.png

    可以看出 AsyncStorage 已经包含 set 、get 、remove 、clear 等一系列静态方法,基本上已经满足了我们对数据增、删、改、查( CURD 下文中我都统一使用简称)的需求。对于 AsyncStorage 的使用,官网建议我们再封装一层,而不是直接使用 AsyncStorage 。

    那我们先在网上搜索一下看看大家是怎么封装 AsyncStorage 的。通过在网上大量的搜索与对比,我把大家的封装方式分为三类:

    1. 重复造轮式 这种封装方式,基本上是新建一个可导出的类,加入几个静态的 CURD 方法,然后在相应的静态方法里面直接调用 AsyncStorage 的 CURD 方法,其它的不做任何处理。 [这种‘‘简陋’’的封装,还不如不封装]

    2. 类型转换式 这种封装方式,相较于重复造轮式,增加了类型转换和异常捕获,使得 AsyncStorage 的数据存的类型不再局限于 string,可以保存对象、数组等结构数据类型,对于取数据的时候也做相应的转换 [基本满足开发需求,但使用不够简单]

    3. 过度封装式 这种封装方式,给 AsyncStorage 的操作增加了很多附加的存、取可选项,比如增加 Where 条件查询,保存,这种表面上看着封装之后对 AsyncStorage 的操作变得更“灵活”,功能“更强大”,实则很鸡肋。** [多此一举,为何不选择 sqlite 库] **

      虽然 AsyncStorage 的底层是 sqlite db 实现的,并不是表示我们就得让 AsyncStorage 支持 sqlite 的各种标准的数据库操作,AsyncStorage 被设计出来的初衷就是用于存取一些结构相对简单的数据,如果真要操作大量、复杂的数据那就应该选择 RN 的 sqlite 库去实现。

    通过以上这几类方式的对比,发现第二种 AsyncStorage 封装方式的是比较合适的。在使用过程中基本也是以 Key-Value 的形式是存、取数据。但是如果项目中有大量的数据存、取操作时。这个 Keys 的维护是一个难题:

    1. 在访问 AsyncStorage 的地方,手动写 key,如:XXX.get('userId'),这种方式缺点也很明显,如果有大量地同一属性的操作,得写很多遍,因此也增加了写错的可能性,Coding 体验非常不好。

    2. 定义属性常量 Key,通过常量 Key 去访问属性,如:XXX.get(Const.User_Id),在属性访问比较频繁的时候,可能这种方式比较合适。但这样又“额外”的引入了常量集合资源,增加了项目的复杂度。

    没有更好的方式去访问 AsyncStorage 呢?当然有,这里就要进入我们今天的主题了, [怎样一分钟实现一个 AsyncStorage 访问器] ,且在使用的时候也能方便,快捷的访问 AsyncStorage 数据。

    第一步: 花 10 秒钟定义一个全局可导出的数据管理对象及需要存储的 userId 属性,如:

    export const RNStorage = {// 持久化数据列表 userId: undefined, // 用户 ID }; 

    第二步: 再花 20 秒的时间,在程序初始化的地方引入 RFStorage,并调用初始化绑定 RNStroage,然后你就可以随意的访问 RNStorage 中的属性了。

    import { RFStorage } from 'react-native-fast-app'; RFStorage.initStorage(RNStorage, () => { // 绑定完成,现在您就可以随意访问 RNStorage 中的任何数据了 RNStorage.userId = '#@23DF424FGD234DKT45IU'; // 相当于 AsyncStorage.setItem('userId','#@23DF424FGD234DKT45IU') console.log('userId=' + RNStorage.userId); // 相当于 console.log(await AsyncStorage.getItem('userId')) }); 

    第三步:

    • 再花 10 秒的时间输入 npm 库安装命令( js 库大小不到 60k ) 安装方式( 2 选 1 ): yarn add react-native-fast-app npm install react-native-fast-app --save

    剩下 20 秒的时间,您只需要端起咖啡等待 react-native-fast-app 库的安装完成。


    有没有很简单,花了 1 分钟不到的时间就构建了一个 RN 的 AsyncStorage 数据访问管理器,从此以后,如果有任何新的数据需要保存到 AsyncStorage 中,只需要在 RNStorage 对象中定义相应的属性字段即可。RNStorage 的属性字段对数据的类型有 stringboolobject 等各种类型的支持。总之一句话:您可以像访问内存对象一样同步访问 RNStorage 里面定义的任何属性,这些属性会被自动同步到 AsyncStorage 中。

    示例项目:react-native-fast-app-sample 中的 StorageController 页面包含 RNStorage 的数据存、取的应用实现,大家可以参考。

    这样文章开头 AsyncStorage 的第二种封装方式的访问问题就迎刃而解了,或许你还不放心,也不懂 RNStorage 的实现原理,那你可以看看这篇文章:

    react-native-fast-app 详解与使用之(一) AsyncStorage

    也可以扫下方二维码加入 RN 技术 QQ 交流群 1531585724192_.pic_hd.jpg

    目前尚无回复
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2957 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 14:05 PVG 22:05 LAX 07:05 JFK 10:05
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86