2016-04-06 8 views
4

In vue.js verwende ich , um Benutzerdaten zu speichern und Benutzer Login-Status zu teilen. In React.js gibt es einen Kontext, um Daten bequem zu teilen.Wie teilen Sie den Anmeldestatus über Komponenten in React Native?

Aber ich habe kein Dokument darüber in React Native finden, was ist der richtige Weg, dies in React Native zu tun?

+0

Ich würde es in einen Service legen. In React für Web und vue.js auch. –

+0

Welcher Service? Neu zu reagieren und noch nie davon gehört. – kxxoling

Antwort

1

Ich verwende Reflux für diesen Zweck (https://github.com/reflux/refluxjs) sowohl in React & React Native.

Die Art, wie es funktioniert, ist, dass Sie einen Speicher mit Ihrem eingeloggten Status, Benutzerdaten usw. einrichten. Wenn sich etwas an diesen Werten ändert (entweder durch einen Ajax-Aufruf, eine Benutzeraktion usw.), können Sie ein Ereignis auslösen der Speicher mit einem Objekt als Argument. (Der Methodenname ist 'trigger').

import Reflux from 'reflux' 
import LoginActions from '../actions/LoginActions' 

var LoginStore = Reflux.createStore({ 

isLoggedIn: false, 
profile: {}, 

init: function() { 
    // Do some initialization, e.g. checking if you've set some login information or tokens in local storage 
}, 

listenables: [LoginActions], 

loginUser: function(e) { 
    // Do some call to a server to try and authenticate 
    // fetch(...) 
    if (fetch_result = true) { 
     this.isLoggedIn = true; 
     this.trigger({type: "LOGIN_STATUS", loggedIn: true}); 
    } 
}, 

logoutUser: function(e) { 
// ... 
} 

Die LoginActions oben verwiesen wird, sind ein sehr einfaches Modul, zum Beispiel:

import Reflux from 'reflux' 
export default LoginActions = Reflux.createActions([ 
    'loginUser', 
    'logoutUser', 
]); 

Ihre Hauptanwendung der Speicherereignisse hören sollte, durch einen Listener hinzufügen und das Objekt basierend auf (die Sie Definieren Sie sich selbst) Sie können Zustände aktualisieren oder eine Logik ausführen; z.B.

componentDidMount() { 
    this.login = LoginStore.listen(this.loginStoreListener.bind(this)); 
} 

componenWillUnmount() { 
    // Remove the listener on unmounting 
    this.login(); 
} 

loginStoreListener(obj) { 
    switch (obj.type) { 
     case "LOGIN_STATUS": 
     this.setState({loggedIn: obj.loggedIn}) 
     break; 
     case "PROFILE": 
     this.setState({profile: obj.profile}) 
     break; 
    } 
} 

In der Hauptanwendung auf der Grundlage des LoggedIn Zustand können Sie dann, die zum Beispiel in Kombination mit Navigator zeigen Ansichten entscheiden.

+0

Dies ist eine ziemlich seltsame Art, Rückfluss zu verwenden. Im Allgemeinen aktualisieren Sie den Status des Geschäfts und lösen dann mit dem neuen Status aus. Es ist an Komponenten mit einem Mixin oder [High-Order-Komponente] gebunden (https://github.com/brigand/reflux-provides-store). Wenn Sie es auf diese Weise tun, können Sie auch einfach die Aktion in der Komponente abonnieren. – FakeRainBrigand

+0

@FakeRainBrigand es ist wahr, ich habe die Mixins noch nicht erkundet, aber das funktioniert gut für mich, solange ich versuche, diese zu benutzen. Könnten Sie Ihren Kommentar erweitern? Ich bin nicht sicher, was der Unterschied zwischen dem Auslösen mit Zustand oder dem Auslösen mit einem Objekt, das auf Status basiert, ist. Da Sie für beide ein Objekt im Listener erhalten ..? –

+0

Es stellt sicher, dass alle Komponenten, die einem Geschäft zuhören, den gleichen Status erhalten. Der Punkt des Flusses ist, den Zustand in den Speichern zu haben, nicht die Komponenten. Das Geschäft ist ein Ort, an dem Aktionen in einen Zustand versetzt werden, und Komponenten erhalten nur den aktuellen Status des Geschäfts. – FakeRainBrigand

Verwandte Themen