web-dev-qa-db-fra.com

Bonne façon de définir Item dans AsyncStorage

Je veux utiliser AsyncStorage.setItem à l'intérieur AsyncStorage.getItem. Comment faire ça correctement?

Mon code est le suivant:

createVehicle: function (vehicle, cb) {
    AsyncStorage.getItem('vehicle')
    .then(json => {

        let vehicles = [];

        if (json) {
            vehicles = JSON.parse(json);
            let o_vehicle = filter(vehicles, {autralis_id: vehicle.autralis_id});
            if (o_vehicle.length > 0) {
                cb(o_vehicle[0].id);
                return;
            } else {
                vehicles.Push(vehicle);
            }
        } else {
            vehicles.Push(vehicle);
        }
        AsyncStorage.setItem('vehicle', JSON.stringify(vehicles), () => {
            cb(vehicle.id + 1)
        });
    }).done();
},

Est-ce la bonne façon de procéder?

8
Boky

J'ai créé un service de stockage qui peut être utilisé dans l'ensemble du projet au fur et à mesure des besoins en transmettant les paramètres requis. Regarde :

export default {
async setItem(key, value) {
    try {
        return await AsyncStorage.setItem(key, JSON.stringify(value));
    } catch (error) {
        // console.error('AsyncStorage#setItem error: ' + error.message);
    }
},
async getItem(key) {
    return await AsyncStorage.getItem(key)
        .then((result) => {
            if (result) {
                try {
                    result = JSON.parse(result);
                } catch (e) {
                    // console.error('AsyncStorage#getItem error deserializing JSON for key: ' + key, e.message);
                }
            }
            return result;
        });
},
async removeItem(key) {
    return await AsyncStorage.removeItem(key);
}
}

C'est de loin la meilleure pratique que j'ai rencontrée jusqu'à la date. Vous devez également l'utiliser.

8
atitpatel
import React, { Component } from 'react'
import { StatusBar } from 'react-native'
import { AsyncStorage, Text, View, TextInput, StyleSheet } from 'react-native'
class AsyncStorageExample extends Component {
   state = {
      'name': ''
   }
   componentDidMount = () => AsyncStorage.getItem('name').then((value) => this.setState({ 
'name': value }))
   setName = (value) => {
      AsyncStorage.setItem('name', value);
      this.setState({ 'name': value });
   }
   render() {
      return (
     <View style = {styles.container}>
        <TextInput style = {styles.textInput} autoCapitalize = 'none'
        onChangeText = {this.setName}/>
        <Text>
           {this.state.name}
        </Text>
     </View>
      )
   }
}
export default AsyncStorageExample
const styles = StyleSheet.create ({
   container: {
      flex: 1,
      alignItems: 'center',
      marginTop: 50
   },
   textInput: {
      margin: 5,
      height: 100,
      borderWidth: 1,
      backgroundColor: '#7685ed'
   }
})
1
Shivo'ham 0

Je ne sais pas si je viens trop tard, mais je l'ai écrit moi-même:

import { Base64 } from 'js-base64';
import { AsyncStorage } from 'react-native';

export async function storeItem(key: string, item: string, isJson: boolean) {
    try {
        return new Promise(async resolve => {
            let stringObject = '';
            if (isJson) {
                stringObject = JSON.stringify(item);
            } else {
                stringObject = item.toString();
            }
            let base64Object = await Base64.encode(stringObject);
            await AsyncStorage.setItem(key, base64Object);
            resolve();
        });
    } catch (e) {
        console.log(e);
    }
}

export async function retrieveItem(key: string, isJson: boolean) {
    try {
        return new Promise(async resolve => {
            let base64Item = await AsyncStorage.getItem(key);
            if (base64Item === null) {
                resolve(null);
            }
            let item = await Base64.decode(base64Item);
            resolve(isJson ? JSON.parse(item) : item);
        });
    } catch (e) {
        console.log(e);
    }
}

export async function removeItem(key: string) {
    try {
        return new Promise(async resolve => {
            await AsyncStorage.removeItem(key);
            resolve();
        });
    } catch (e) {}
}

J'utilise base64 à cause des caractères spéciaux.

J'espère que cela pourrait aider :)

0
JulienBlc

Veuillez vous référer à ceci document officiel , il utilise getItem à l'intérieur setItem, donc je pense que vous pouvez également utiliser setItem à l'intérieur getItem , car la valeur de retour est simplement un Promise pour getItem et setItem.

AsyncStorage.setItem('UID123', JSON.stringify(UID123_object), () => {
  AsyncStorage.mergeItem('UID123', JSON.stringify(UID123_delta), () => {
    AsyncStorage.getItem('UID123', (err, result) => {
      console.log(result);
    });
  });
});
0
yifan_z