移动跨平台ReactNative存储数据组件AsyncStorage【13】_读取数据

​前端江太公​



React Native,是一个混合移动应用开发框架,是目前流行的跨平台移动应用开发框架之一。React Native 采用不同的方法进行混合移动应用开发。它不会生成原生 UI 组件,而是基于 React,React Native
是一个用于构建基于 Web 的交互界面的 JavaScript 库,因此会有更丰富的 UI 体验效果,同时也能够很好地调用底层框架的UI使用。


React Native系列导航

​01-React Native 基础教程​

​02-安装ReactNative​

​03-ReactNative目录结构​

​04-ReactNative视图View​

​05-ReactNative组件样式style​

​06-ReactNative文本组件Text​

​07-ReactNative组件状态state​

​08-ReactNative组件属性props​

​09-ReactNative输入组件TextInput​

​10-ReactNative图片组件Image​

​11-ReactNative活动指示器组件​

​12-ReactNative弹出框Alert​

​13-ReactNative存储数据组件AsyncStorage​

​14-ReactNative动画组件Animated​

​15-ReactNative开关组件Switch​

​16-状态栏组件StatusBar​

​17-ReactNative滚动视图ScrollView​

​18-ReactNative选择器Picker​

​19-ReactNative网络请求​

React Native 存储数据组件 AsyncStorage

React Native 提供了 ​​AsyncStorage​​ 组件用于存储数据。

在 ​​0.60​​​ 版本之前,这个组件是内置的,​​0.60​​​ 版本把它移到了 ​​react-native-community/react-native-async-storage​​。

AsyncStorage 是一个简单的,未加密的,异步的,持久的键值存储系统。

AsyncStorage 是一个全局的存储系统,没有实例这一概念。要存储数据就往里面扔,要读取数据就发起请求。

AsyncStorage 对外提供了简单的 ​​JavaScript​​ 接口。每一个接口都是 异步 的,每一个接口都返回一个 ​​Promise​​ 对象。

React Native 存储数据组件 AsyncStorage

安装组件

虽然之前的版本都是内置,但 0.60 版本将组件移到了 ​​react-native-community/react-native-async-storage​​。

为了兼容所有版本,我们推荐安装 ​​react-native-community/react-native-async-storage​​。

yarn add @react-native-community/async-storage

npm i @react-native-community/async-storage

链接组件

React Native 0.60+ 版本会自动链接

但之前的版本则需要我们手动链接

react-native link @react-native-community/async-storage

如果你从低版本升级到 0.60+ 版本,反而要删除链接,命令如下

react-native unlink @react-native-community/async-storage

引入组件

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

对外提供的方法

方法

说明

getItem()

根据给定的 key 来读取数据

setItem()

将一个键值对添加到系统中,如果已经存在 key 则覆盖

removeItem()

根据给定的 key 删除指定的键值对

getAllKeys()

返回数据库中所有的

multiGet()

根据给定的 key 列表获取多个键值对

multiSet()

将多个键值对存储到系统中

multiRemove()

根据多个 key 删除多个键值对

clear()

清空整个数据库系统

每一个接口的详细信息,可以 ​​官方 API 文档​

使用示例

存储数据

storeData = async () => {
try {
await AsyncStorage.setItem('@storage_Key', 'stored value')
} catch (e) {
// 保存失败
}
}

读取数据

getData = async () => {
try {
const value = await AsyncStorage.getItem('@storage_Key')
if(value !== null) {
// 之前存储的数据
}
} catch(e) {
// 读取数据失败
}
}

最佳实战

  • 数据可能不存在,推荐在​​constructor()​​ 构造函数中先初始化一个默认值
  • 推荐把读取数据的逻辑放到​​componentDidMount()​​ 中。

范例

下面的代码演示了如何在存储数据组件 AsyncStorage 中存储和读取数据。

App.js

import React, { Component } from 'react'
import { Text, View, Alert,TextInput, StyleSheet,TouchableHighlight } from 'react-native'
import AsyncStorage from '@react-native-community/async-storage';

export default class App extends Component {
state = {
'name': '你好 www.twle.cn',
'inputText':'你好,简单教程',
}

async readName() {
try {
const value = await AsyncStorage.getItem('name')
if(value !== null) {
this.setState({ 'name': value })
}
Alert.alert("读取数据成功")
} catch(e) {
console.log(e);
Alert.alert("读取数据失败!")
}
}

setName = () => {
AsyncStorage.setItem('name', this.state.inputText);
Alert.alert("保存成功!")
}
render() {
return (
<View style = {styles.container}>
<TextInput
style = {styles.textInput}
autoCapitalize = 'none'
value={this.state.inputText} />
<View style={{flexDirection:'row'}}>
<TouchableHighlight style={[styles.button,{marginRight:8}]} onPress={this.setName}>
<Text style={styles.buttonTxt}>保存</Text>
</TouchableHighlight>
<TouchableHighlight style={[styles.button,{backgroundColor:'blue'}]} onPress={this.readName.bind(this)}>
<Text style={styles.buttonTxt}>读取</Text>
</TouchableHighlight>
</View>
<View style={{marginTop:8}}>
<Text>当前的值:{this.state.name}</Text>
</View>
</View>
)
}
}

const styles = StyleSheet.create ({
container: {
margin:10
},
textInput: {
margin: 5,
height: 44,
width:'100%',
borderWidth: 1,
borderColor: '#dddddd'
},
button: {
flex:1,
height:44,
justifyContent:'center',
alignItems:'center',
width:100,
backgroundColor: 'red'
},
buttonTxt:{
justifyContent:'center',
color:'#ffffff'
}
})

演示