9

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

 4 years ago
source link: https://www.jianshu.com/p/00264f51276c?
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

0.1342020.04.10 16:17:25字数 1,398阅读 488

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

webp
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 秒钟定义一个全局可导出的数据管理对象及需要存储的相应属性,如:

export const RNStorage = {// RNStorage 自定义数据存储对象
       token: undefined, //  字符串类型
       isShow: undefined, // 布尔类型
       userInfo: undefined, // 对象类型
   };

第二步:
再花 20 秒的时间,在程序初始化的地方引入XStorage,并调用初始化绑定RNStroage与AsyncStorage,然后你就可以在任何地方对RNStorage中字义的变量进行【取值】、【赋值】操作了,相应的属性值,会被自动同步持久化到AsyncStorage中。

import { XStorage } from 'react-native-easy-app';
import { AsyncStorage } from 'react-native';

  XStorage.initStorage(RNStorage, AsyncStorage, () => {
  // 当自定义对象 RNStorage 被初始化完成之后,就可以对其任何属性进行取值、赋值操作;
  // 对RNStorage 属性的取、赋值操作会被自动映射成 AsyncStorage 的getItem与setItem方法;
             
 console.log(RNStorage.isShow);
 // 相当于 [ console.log(await AsyncStorage.getItem('isShow')) ] 
 
 RNStorage.token = 'TOKEN1343DN23IDD3PJ2DBF3==';
 // 相当于 [ await AsyncStorage.setItem('token',TOKEN1343DN23IDD3PJ2DBF3==') ] 
 
 RNStorage.userInfo = {name: 'rufeng', age: 30};
 // 相当于 [ await AsyncStorage.setItem('userInfo',JSON.stringify({ name:'rufeng', age:30})) ] 
  });

第三步:

  • 再花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的实现原理,那你可以看看这篇文章:

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

也可以扫下方二维码加入RN技术QQ交流群

qq_qrCode.jpg

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK