[关闭]
@yzzer 2020-05-20T18:24:21.000000Z 字数 2758 阅读 700

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

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

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

链接组件

React Native 0.60+ 版本会自动链接

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

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

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

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

引入组件

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

对外提供的方法

方法 说明
getItem() 根据给定的 key 来读取数据
setItem() 将一个键值对添加到系统中,如果已经存在 key 则覆盖
removeItem() 根据给定的 key 删除指定的键值对
getAllKeys() 返回数据库中所有的
multiGet() 根据给定的 key 列表获取多个键值对
multiSet() 将多个键值对存储到系统中
multiRemove() 根据多个 key 删除多个键值对
clear() 清空整个数据库系统

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

使用示例

存储数据

  1. storeData = async () => {
  2. try {
  3. await AsyncStorage.setItem('@storage_Key', 'stored value')
  4. } catch (e) {
  5. // 保存失败
  6. }
  7. }

读取数据

  1. getData = async () => {
  2. try {
  3. const value = await AsyncStorage.getItem('@storage_Key')
  4. if(value !== null) {
  5. // 之前存储的数据
  6. }
  7. } catch(e) {
  8. // 读取数据失败
  9. }
  10. }

最佳实战

范例

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

App.js

  1. import React, { Component } from 'react'
  2. import { Text, View, Alert,TextInput, StyleSheet,TouchableHighlight } from 'react-native'
  3. import AsyncStorage from '@react-native-community/async-storage';
  4. export default class App extends Component {
  5. state = {
  6. 'name': '你好BUCT',
  7. 'inputText':'你好,yzzer',
  8. }
  9. async readName() {
  10. try {
  11. const value = await AsyncStorage.getItem('name')
  12. if(value !== null) {
  13. this.setState({ 'name': value })
  14. }
  15. Alert.alert("读取数据成功")
  16. } catch(e) {
  17. console.log(e);
  18. Alert.alert("读取数据失败!")
  19. }
  20. }
  21. setName = () => {
  22. AsyncStorage.setItem('name', this.state.inputText);
  23. Alert.alert("保存成功!")
  24. }
  25. render() {
  26. return (
  27. <View style = {styles.container}>
  28. <TextInput
  29. style = {styles.textInput}
  30. autoCapitalize = 'none'
  31. value={this.state.inputText} />
  32. <View style={{flexDirection:'row'}}>
  33. <TouchableHighlight style={[styles.button,{marginRight:8}]} onPress={this.setName}>
  34. <Text style={styles.buttonTxt}>保存</Text>
  35. </TouchableHighlight>
  36. <TouchableHighlight style={[styles.button,{backgroundColor:'blue'}]} onPress={this.readName.bind(this)}>
  37. <Text style={styles.buttonTxt}>读取</Text>
  38. </TouchableHighlight>
  39. </View>
  40. <View style={{marginTop:8}}>
  41. <Text>当前的值:{this.state.name}</Text>
  42. </View>
  43. </View>
  44. )
  45. }
  46. }
  47. const styles = StyleSheet.create ({
  48. container: {
  49. margin:10
  50. },
  51. textInput: {
  52. margin: 5,
  53. height: 44,
  54. width:'100%',
  55. borderWidth: 1,
  56. borderColor: '#dddddd'
  57. },
  58. button: {
  59. flex:1,
  60. height:44,
  61. justifyContent:'center',
  62. alignItems:'center',
  63. width:100,
  64. backgroundColor: 'red'
  65. },
  66. buttonTxt:{
  67. justifyContent:'center',
  68. color:'#ffffff'
  69. }
  70. })

演示

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注