在React Native开发过程中总避免不了需要存储一些数据在本地。对于大多数应用只需要存储一些结构简单的数据如标记位用户信息等。这时候我们首选择的存储方式就是AsyncStorage那我们先来看下AsyncStorage给我提供了哪些基本方法
可以看出AsyncStorage已经包含set、get、remove、clear等一系列静态方法基本上已经满足了我们对数据增、删、改、查CURD 下文中我都统一使用简称的需求。对于AsyncStorage的使用官网建议我们再封装一层而不是直接使用AsyncStorage。
那我们先在网上搜索一下看看大家是怎么封装AsyncStorage的。通过在网上大量的搜索与对比我把大家的封装方式分为三类
-
重复造轮式
这种封装方式基本上是新建一个可导出的类加入几个静态的CURD方法然后在相应的静态方法里面直接调用AsyncStorage的CURD方法其它的不做任何处理。【这种‘‘简陋’’的封装还不如不封装】 -
类型转换式
这种封装方式相较于重复造轮式增加了类型转换和异常捕获使得
AsyncStorage的数据存的类型不再局限于string可以保存对象、数组等结构数据类型对于取数据的时候也做相应的转换【基本满足开发需求但使用不够简单】 -
过度封装式
这种封装方式给AsyncStorage的操作增加了很多附加的存、取可选项比如增加Where条件查询保存这种表面上看着封装之后对AsyncStorage的操作变得更“灵活”功能“更强大”实则很鸡肋。【多此一举为何不选择 sqlite 库】虽然AsyncStorage的底层是sqlite db实现的并不是表示我们就得让AsyncStorage支持sqlite的各种标准的数据库操作AsyncStorage被设计出来的初衷就是用于存取一些结构相对简单的数据如果真要操作大量、复杂的数据那就应该选择RN的 sqlite库去实现。
通过以上这几类方式的对比发现第二种AsyncStorage封装方式的是比较合适的。在使用过程中基本也是以Key-Value的形式是存、取数据。但是如果项目中有大量的数据存、取操作时。这个Keys的维护是一个难题
-
在访问AsyncStorage的地方手动写key如XXX.get(‘userId’)这种方式缺点也很明显如果有大量地同一属性的操作得写很多遍因此也增加了写错的可能性Coding体验非常不好。
-
定义属性常量Key通过常量Key去访问属性如XXX.get(Const.User_Id)在属性访问比较频繁的时候可能这种方式比较合适。但这样又“额外”的引入了常量集合资源增加了项目的复杂度。
没有更好的方式去访问AsyncStorage呢当然有这里就要进入我们今天的主题了【怎样一分钟实现一个AsyncStorage 访问器】且在使用的时候也能方便快捷的访问AsyncStorage数据。
第一步
花 10 秒钟定义一个全局可导出的数据管理对象及需要存储的userId属性如
export const RNStorage = {// 持久化数据列表
userId: undefined, // 用户ID
};
第二步
再花 20 秒的时间在程序初始化的地方引入XStorage并调用初始化绑定RNStroage然后你就可以随意的访问RNStorage中的属性了。
import { XStorage } from 'react-native-easy-app';
import { AsyncStorage } from 'react-native';
XStorage.initStorage(RNStorage, AsyncStorage,() => {
// 绑定完成现在您就可以随意访问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-easy-app
npm install react-native-easy-app --save
剩下20秒的时间您只需要端起咖啡等待 react-native-easy-app 库的安装完成。
有没有很简单花了1分钟不到的时间就构建了一个RN的AsyncStorage数据访问管理器从此以后如果有任何新的数据需要保存到AsyncStorage中只需要在RNStorage对象中定义相应的属性字段即可。RNStorage的属性字段对数据的类型有 stringboolobject 等各种类型的支持。总之一句话您可以像访问内存对象一样同步访问RNStorage里面定义的任何属性这些属性会被自动同步到AsyncStorage中。
示例项目react-native-easy-app-sample 中的 StorageController 页面包含RNStorage的数据存、取的应用实现大家可以参考。
这样文章开头AsyncStorage的第二种封装方式的访问问题就迎刃而解了或许你还不放心也不懂RNStorage的实现原理那你可以看看这篇文章