Je travaille sur une application native React qui utilise redux pour la gestion des états. Je souhaite que cette application fonctionne hors ligne et que toutes les données soient conservées.
Une fois que l'application a accès au réseau, toutes les données doivent être synchronisées avec la base de données en ligne à l'aide de l'API REST. Veuillez suggérer les meilleures façons d'aborder ce scénario, car je suis nouveau dans le développement d'applications REACT NATIVE / Mobile.
Aide très appréciée.
J'ai essayé de stocker toutes les données à l'aide de l'API AsyncStorage, mais je trouve qu'il est difficile de gérer toutes les données et je ne parviens pas à comprendre comment synchroniser efficacement avec la base de données en ligne une fois que l'application a accès au réseau.
4 Réponses :
Le moyen le plus simple de stocker des données hors connexion consiste à utiliser AsyncStorage . Vous pouvez enregistrer json ou sous forme de texte. Comme
AsyncStorage.getItem('saveitems', (err, result) => { console.log(JSON.parse(result)); });
Pour obtenir les données, vous pouvez suivre le processus ci-dessous:
AsyncStorage.setItem('saveitems', JSON.stringify([{id: 1, name: 'test', xyz: ''}]));
Si vous souhaitez gérer efficacement la connexion réseau, vous pouvez utiliser
react-native-offline
Cliquez ici pour obtenir des explications
Si vous souhaitez étudier d'autres options de stockage, vous pouvez vérifier le lien ci-dessous.
Cliquez ici p >
Pour stocker votre redux-store dans un emplacement persistant, vous pouvez utiliser bibliothèque redux-persist .
Pour travailler avec l'état du réseau, vous devez utiliser la classe d'assistance NetInfo
de React Native
Pour vérifier l'état du réseau (en ligne / hors ligne) :
NetInfo.addEventListener('connectionChange', ({type}) => { switch (type) { case 'none': case 'unknown': // offline statuses, so do nothing return default: // fetch your data here } })
Pour gérer le changement d'état du réseau :
NetInfo.getConnectionInfo().then(({type}) => { switch (type) { case 'none': case 'unknown': // offline status default: // online status } })
Merci beaucoup @Michael Sivolobov. Je pense que c'est très proche de ce que je recherchais.
Si vous souhaitez stocker une grande quantité de données, vous pouvez utiliser package react-native-sqlite-storage en tant que base de données locale.
Cela vous aidera à stocker toutes les données que vous souhaitez enregistrer et lorsque l'utilisateur se connecte au réseau, récupère toutes les données de la base de données et se synchronise avec la base de données en ligne.
Pour l'état du réseau, vous pouvez utiliser la classe NetInfo de react native.
Chaque fois que j'envoie une action à distance, je l'enregistre sur AsyncStorage avec son nom unique préféré.
Le coup de code vérifie la connectivité d'un appareil Android, puis envoie l'action une fois connecté Si nous sommes connectés à Internet, il enverra une action Sinon, il obtiendra les données d'AsyncStorage et les enverra à l'action en tant que deuxième paramètre à stocker en tant qu'état redux.
Composant qui appelle l'action
export default function fetchTasks(token, asyncStorageData) { if (asyncStorageData !== null) { return function(dispatch) { dispatch({ type: FETCH_TASKS_SUCCESSFUL, payload: asyncStorageData }); }; } return function(dispatch) { axios .get(`${api_endpoint}/your/data`, { headers: { Token: token } }) .then(response => { dispatch({ type: FETCH_TASKS_SUCCESSFUL, payload: response.data }); AsyncStorage.setItem( "@Your:Data", JSON.stringify(response.data) ); }) .catch(err => { dispatch({ type: FETCH_TASKS_ERROR, payload: err }); }); }; }
Je suis curieux de savoir pourquoi vous obtenez des données directement d'AsyncStorage dans votre composant au lieu de vérifier l'état en ligne et de revenir d'AsyncStorage ou de Fetching dans votre action Redux. Je ne dis pas que c'est la mauvaise façon, je ne comprends tout simplement pas pourquoi vous accédez directement à l'état dans le composant ...
Que voulez-vous dire? pouvez-vous expliquer plus?
softwareengineering.stackexchange.com/questions/366724/...
Vérifiez le lien ci-dessus, j'espère que cela vous aidera