React-NativeH5+JSReact Native实践

React Native 学习之AsyncStorage

2016-11-13  本文已影响304人  BlainPeng

在APP开发中,不管是Android还是IOS,都会有一些配置信息需要保存到设备中。保存数据大部分都是用数据库,但是若数据量不是很多的话,去用数据来保存的话就有点杀鸡焉用牛刀了。对于用户轻量级的数据持久化,在Android平台上是用的SharedPreference,而在IOS平台上用的是NSUserDefaults,它们都是以 "key-value(键值对)"形式保存数据的。

对于RN来说,它也提供了一个存储轻量级数据的结构,也就是我们今天要学习的AsyncStorage。它是一个简单的、具有异步特性的的键值对的存储系统。通过一个简单的购物车Demo来学习AsyncStorage的用法,效果如下:

AsyncStorage_IOS.gif

API学习

对于数据的存储,一般会涉及到四个方面,增删改查。那我们就来看看RN给我们提供哪些API来进行这四个操作了。

// 根据键来获取值,获取到的结果会在回调函数中
getItem(key : string, callback:(error,result)) 

//设置键值对
setItem(key : string, value : string, callback:(error))

//根据键移除一项
removeItem(key : string, callback:(error))

//合并现有值和输入值(其实就是更新某个key对应的旧value值)
mergeItem(key : string, value : string, callback:(error))

//清除所有项目
clear(callback:(error))

//获取所有的键
getAllKeys(callback:(error))

//获取多项,其中keys是字符串数组
multiGet(keys, callback:(error,result)) 

//设置多项,其中keyValuePairs是字符串的二维数组
multiSet(keyValuePairs, callback:(errors))

//删除多项,其中keys是字符串数组
multiRemove(keys, callback:(error)) 

//多个键值对合并,其中keyValuePairs是字符串的二维数组
multiMerge(keyValuePairs, callback:(errors))

我们可以看到,每个方法都有一个回调方法,而回调方法的第一个参数都是错误对象。如果发生错误,该对象就会展示错误信息,否则为null。所有的方法执行后,都会返回一个Promise对象。了解更多Promise信息 所以我们在使用AsyncStorage时,自己可以做一层封装,通过返回Promise对象来进行其他的一些异步操作等

Demo主要实现

Demo遇到的问题

好了,购物车Demo基本上就完了,但是在运行时发现一个小bug,如下图:

bug.gif

我们在购物车界面清除掉了购物车后,再回到水果列表界面,但是我们的 "去结算"button仍然显示还有4件商品,很显然是我们的AsyncStorage没有更新,怎样去更新数据是非常简单的,但问题是在哪里去更新?

我们来看看效果:

bug_resolve.gif

从效果图来看,确实可以实现,但是在Android平台上会出现一个warning,IOS没有。如下图:

warning_android.png

警告说setState只能在一个route被mounting或者mounted时才能被调用。很显然,我们在点击清空按钮时,水果列表界面压根就没有被mounting或者mounted,但我们却setState了。

这种报警告的问题,忽略它的话也没有什么问题,但我们公司在Code Review时是不被允许的,虽然看起来没有问题,但仍然存在一些潜在的风险。

好了,AsyncStorage的学习就到这里了。若各位对上面提的那个小bug有完美的解决方案的话,烦请告诉我啊。

完整代码下载

上一篇 下一篇

猜你喜欢

热点阅读