V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
rufeng008
V2EX  ›  程序员

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

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

    在 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   ·   实用小工具   ·   5647 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 06:42 · PVG 14:42 · LAX 22:42 · JFK 01:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.