react-native-storage文档介绍

36次阅读

共计 4042 个字符,预计需要花费 11 分钟才能阅读完成。

中文 doc: 仅供参考 import Storage from ‘react-native-storage’;import {AsyncStorage} from ‘react-native’;
var storage = new Storage({
// 最大容量,默认值 1000 条数据循环存储
size: 1000,

// 存储引擎:对于 RN 使用 AsyncStorage,对于 web 使用 window.localStorage
// 如果不指定则数据只会保存在内存中,重启后即丢失
storageBackend: AsyncStorage,

// 数据过期时间,默认一整天(1000 * 3600 * 24 毫秒),设为 null 则永不过期
defaultExpires: 1000 * 3600 * 24,

// 读写时在内存中缓存数据。默认启用。
enableCache: true,

// 如果 storage 中没有相应数据,或数据已过期,
// 则会调用相应的 sync 方法,无缝返回最新数据。
// sync 方法的具体说明会在后文提到
// 你可以在构造函数这里就写好 sync 的方法
// 或是在任何时候,直接对 storage.sync 进行赋值修改
// 或是写到另一个文件里,这里 require 引入
// sync: require(‘ 你可以另外写一个文件专门处理 sync’)

})

// 最好在全局范围内创建一个(且只有一个)storage 实例,方便直接调用

// 对于 web
// window.storage = storage;

// 对于 react native
// global.storage = storage;

// 这样,在此 ** 之后 ** 的任意位置即可以直接调用 storage
// 注意:全局变量一定是先声明,后使用
// 如果你在某处调用 storage 报错未定义
// 请检查 global.storage = storage 语句是否确实已经执行过了

// 使用 key 来保存数据。这些数据一般是全局独有的,常常需要调用的。
// 除非你手动移除,这些数据会被永久保存,而且默认不会过期。
storage.save({
key: ‘loginState’, // 注意: 请不要在 key 中使用_下划线符号!
data: {
from: ‘some other site’,
userid: ‘some userid’,
token: ‘some token’
},

// 如果不指定过期时间,则会使用 defaultExpires 参数
// 如果设为 null,则永不过期
expires: 1000 * 3600
});

// 读取
storage.load({
key: ‘loginState’,

// autoSync(默认为 true) 意味着在没有找到数据或数据过期时自动调用相应的 sync 方法
autoSync: true,

// syncInBackground(默认为 true) 意味着如果数据过期,
// 在调用 sync 方法的同时先返回已经过期的数据。
// 设置为 false 的话,则等待 sync 方法提供的最新数据 (当然会需要更多时间)。
syncInBackground: true,

// 你还可以给 sync 方法传递额外的参数
syncParams: {
extraFetchOptions: {
// 各种参数
},
someFlag: true,
},
}).then(ret => {
// 如果找到数据,则在 then 方法中返回
// 注意:这是异步返回的结果(不了解异步请自行搜索学习)
// 你只能在 then 这个方法内继续处理 ret 数据
// 而不能在 then 以外处理
// 也没有办法“变成”同步返回
// 你也可以使用“看似”同步的 async/await 语法

console.log(ret.userid);
this.setState({user: ret});
}).catch(err => {
// 如果没有找到数据且没有 sync 方法,
// 或者有其他异常,则在 catch 中返回
console.warn(err.message);
switch (err.name) {
case ‘NotFoundError’:
// TODO;
break;
case ‘ExpiredError’:
// TODO
break;
}
})

// 使用 key 和 id 来保存数据,一般是保存同类别(key)的大量数据。
// 所有这些 ”key-id” 数据共有一个保存上限(无论是否相同 key)
// 即在初始化 storage 时传入的 size 参数。
// 在默认上限参数下,第 1001 个数据会覆盖第 1 个数据。
// 覆盖之后,再读取第 1 个数据,会返回 catch 或是相应的 sync 方法。
var userA = {
name: ‘A’,
age: 20,
tags: [
‘geek’,
‘nerd’,
‘otaku’
]
};

storage.save({
key: ‘user’, // 注意: 请不要在 key 中使用_下划线符号!
id: ‘1001’, // 注意: 请不要在 id 中使用_下划线符号!
data: userA,
expires: 1000 * 60
});

//load 读取
storage.load({
key: ‘user’,
id: ‘1001’
}).then(ret => {
// 如果找到数据,则在 then 方法中返回
console.log(ret.userid);
}).catch(err => {
// 如果没有找到数据且没有 sync 方法,
// 或者有其他异常,则在 catch 中返回
console.warn(err.message);
switch (err.name) {
case ‘NotFoundError’:
// TODO;
break;
case ‘ExpiredError’:
// TODO
break;
}
})

// ————————————————–

// 获取某个 key 下的所有 id
storage.getIdsForKey(‘user’).then(ids => {
console.log(ids);
});

// 获取某个 key 下的所有数据
storage.getAllDataForKey(‘user’).then(users => {
console.log(users);
});

// !! 清除某个 key 下的所有数据
storage.clearMapForKey(‘user’);

// ————————————————–

// 删除单个数据
storage.remove({
key: ‘lastPage’
});
storage.remove({
key: ‘user’,
id: ‘1001’
});

// !! 清空 map,移除所有 ”key-id” 数据(但会保留只有 key 的数据)
storage.clearMap();

// 同步远程数据(刷新)
storage.sync = {
// sync 方法的名字必须和所存数据的 key 完全相同
// 方法接受的参数为一整个 object,所有参数从 object 中解构取出
// 这里可以使用 promise。或是使用普通回调函数,但需要调用 resolve 或 reject。
user(params){
let {id, resolve, reject, syncParams: {extraFetchOptions, someFlag}} = params;
fetch(‘user/’, {
method: ‘GET’,
body: ‘id=’ + id,
…extraFetchOptions,
}).then(response => {
return response.json();
}).then(json => {
//console.log(json);
if (json && json.user) {
storage.save({
key: ‘user’,
id,
data: json.user
});

if (someFlag) {
// 根据 syncParams 中的额外参数做对应处理
}

// 成功则调用 resolve
resolve && resolve(json.user);
}
else {
// 失败则调用 reject
reject && reject(new Error(‘data parse error’));
}
}).catch(err => {
console.warn(err);
reject && reject(err);
});
}

}

// 有了上面这个 sync 方法,以后再调用 storage.load 时,如果本地并没有存储相应的 user,那么会自动触发 storage.sync.user 去远程取回数据并无缝返回。

storage.load({
key: ‘user’,
id: ‘1002’
}).then()

// 读取批量数据

// 使用和 load 方法一样的参数读取批量数据,但是参数是以数组的方式提供。
// 会在需要时分别调用相应的 sync 方法,最后统一返回一个有序数组。
storage.getBatchData([
{key: ‘loginState’},
{key: ‘checkPoint’, syncInBackground: false},
{key: ‘balance’},
{key: ‘user’, id: ‘1009’}
])
.then(results => {
results.forEach(result => {
console.log(result);
})
})

// 根据 key 和一个 id 数组来读取批量数据
storage.getBatchDataWithIds({
key: ‘user’,
ids: [‘1001’, ‘1002’, ‘1003’]
})
.then()

/*
这两个方法除了参数形式不同,还有个值得注意的差异。getBatchData 会在数据缺失时挨个调用不同的 sync 方法 (因为 key 不同)。
但是 getBatchDataWithIds 却会把缺失的数据统计起来,将它们的 id 收集到一个数组中,然后一次传递给对应的 sync 方法 (避免挨个查询导致同时发起大量请求),
所以你需要在服务端实现通过数组来查询返回,还要注意对应的 sync 方法的参数处理(因为 id 参数可能是一个字符串,也可能是一个数组的字符串)。
*/

正文完
 0