ReactNative数据存储async-storage

@react-native-community/async-storage

该组件主要提供了数据存储、数据读取功能,ReactNative应用可支持如:记住密码、记住账号、缓存数据等功能。

async-storage采用的key-value数据结构,读取方便,可结合JSON数据格式存储数据。

github的项目地址:

https://github.com/react-native-community/async-storage

备注:具体的导入到RN项目本文不再讨论。

AsyncStorage提供的接口

在代码中导入组件

import AsyncStorage from '@react-native-community/async-storage';

具体的接口文档:

https://github.com/react-native-community/async-storage/blob/LEGACY/docs/API.md

AsyncStorage实战

需求:
需求是这样的,需要提供一个可记住账号和密码的功能,并且存储用户登录的Token信息。

分析:需要使用本地存储存放用登录信息和token,可提供如下接口:
setToken\getToken
setUserInfo\getUserInfo
setAccountInfo\getAccountInfo
三类接口满足需求。数据格式采用JSON字符串格式,由于AsyncStorage采用的key-value格式且都为字符串存储,所以JSON格式需要转换为字符串。

编辑Store.js文件如下:


import {useAsyncStorage} from '@react-native-community/async-storage'; /** 默认导出Store对象 */ export default { /** * Token信息 * @param value */ setToken: function(value){ const { setItem, removeItem} = useAsyncStorage('@Token'); if(value){ setItem(JSON.stringify(value)); }else{ removeItem(); } }, getToken: async function(){ const {getItem} = useAsyncStorage('@Token'); return JSON.parse(await getItem()); } , /** * 用户登录信息 * @param value */ setUserInfo: function(value){ const {setItem, removeItem} = useAsyncStorage('@UserInfo'); if(value){ setItem(JSON.stringify(value)); }else{ removeItem(); } }, getUserInfo: async function(){ const {getItem} = useAsyncStorage('@UserInfo'); return JSON.parse(await getItem()); } , /** * 记住账号密码 * @param value */ setAccountInfo: function(value){ const {setItem, removeItem} = useAsyncStorage('@AccountInfo'); if(value){ setItem(JSON.stringify(value)); }else{ removeItem(); } }, getAccountInfo: async function(){ const {getItem} = useAsyncStorage('@AccountInfo'); return JSON.parse(await getItem()); } , }

以上接口实现好了,接下来就是在ReactNative组件中去调用Store.js接口


import Store from './Store'; // Store.js导入对应的接口 const {getUserInfo, setUserInfo} = Store; const {getToken, setToken} = Store; const {getAccountInfo, setAccountInfo} = Store; /** * 登录界面 * * @author marker */ export default class Login extends Component { constructor(props) { super(props); this.state = { username: '', password: '', grant_type: 'password', // 密码模式登录 rememberMe: false, // 是否记住密码 }; } /** * 组件装载完成 */ componentDidMount(){ var that = this; // 获取记住账号密码信息 var data = getAccountInfo(); // 这里是因为实现为Promise,采用then异步获取数据 data.then(function(obj){ // 更新组件的状态数据 that.setState({ username: obj.username, password: obj.password, rememberMe: obj.rememberMe, }); }); } /** * 渲染组件 */ render(){ // 此处省略一万行代码 } /** * 登录成功 * @param {*} that */ _onLogin(res){ var that = this; const { navigate } = this.props.navigation; // 此处省略校验参数代码和登录请求代码,假设请求登录成功。 res.loginTime = new Date().getTime(); // await 就是让这段异步代码同步执行。 await setToken(res); // 勾选了记住密码 if(that.state.rememberMe) { // 记住密码 var data = { username: that.state.username, password: that.state.password, rememberMe: that.state.rememberMe, } await setAccountInfo(data); } else { // 没有勾选就记录个空对象数据 await setAccountInfo({}); } // 假设获取登录用户信息为loginInfo对象 let loginInfo = {}; await setUserInfo(loginInfo); } }

以上伪代码基本介绍了封装async-storage的使用。

结束

来源: 雨林博客(www.yl-blog.com)