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

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. })

演示

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