2015-08-05 13 views
11

Ho imparato React e Flux negli ultimi mesi, e una cosa che non ho ancora affrontato è la visualizzazione di messaggi di errore agli utenti. In particolare, i messaggi di errore che si verificano a seguito di una richiesta http ajax all'interno di un metodo di creazione di azioni di flusso.Come coordinare i messaggi di errore del server tra Flux e React?

Un semplice esempio è l'accesso dell'utente: se il segno in una richiesta Ajax non riesce a causa di una password errata, il server risponde con l'errore. In quel momento, all'interno del mio metodo di creazione di azioni di flusso, la mia unica opzione è quella di inviare un'azione contenente le informazioni di errore, giusto?

Posso inviare le informazioni di errore e mantenere questo errore in un negozio. Non sono sicuro di quale sia il modo migliore per legare determinati errori a determinati componenti. Diciamo che la mia struttura dei componenti reattiva sta visualizzando più componenti che riconoscono gli errori, ma si verifica un errore durante il tentativo di autenticazione dell'utente sul lato server e deve essere visualizzato su tale modulo di accesso.

Esiste un buon modello o una convenzione per archiviare gli errori e sapere a quale componente sono destinati? Esiste un modo programmatico per determinare ciò, invece di passare un identificatore ad ogni funzione di azione che identifica il componente che il creatore dell'azione è chiamato, ecc.?

risposta

10

Poiché hai contrassegnato la domanda con il tag Redux, presumo che tu usi Redux.
In tal caso, questo real-world example mostra la gestione degli errori.

C'è

un reducer that reacts to any action with error field:

// Updates error message to notify about the failed fetches. 
function errorMessage(state = null, action) { 
    const { type, error } = action; 

    if (type === ActionTypes.RESET_ERROR_MESSAGE) { 
    return null; 
    } else if (error) { 
    return action.error; 
    } 

    return state; 
} 

L'API personalizzato middleware puts any error message into error field on the action:

return callApi(endpoint, schema).then(
    response => next(actionWith({ 
     response, 
     type: successType 
    })), 
    error => next(actionWith({ 
     type: failureType, 
     error: error.message || 'Something bad happened' 
    })) 
); 

Infine, la componente reads the error message from Redux store:

function mapStateToProps(state) { 
    return { 
    errorMessage: state.errorMessage 
    }; 
} 

Come potete vedere, questo non è un qualsiasi diverso da come gestiresti la visualizzazione dei dati recuperati.

+0

Immaginate un'applicazione di tipo di foglio di calcolo, in cui ogni cella salva tramite ajax onblur. Se il salvataggio fallisce, l'utente dovrebbe vedere un messaggio di errore _nella cella che non è riuscito a salvare_. Ora hai potenzialmente un messaggio di errore per ogni cella. Stai salvando tutti quegli errori nel negozio stesso? Come stai mappando gli errori alle celle? Grazie per qualsiasi consiglio. – Jonah

+0

Supponendo che le celle abbiano una sorta di ID (che devono comunque essere usati come 'chiave' per un rendering efficiente), mantenere la mappatura' errorsByID: {id -> error} 'nello store. –

+0

Grazie per la risposta. Il problema che sto riscontrando con questa soluzione è che le mie chiavi non sono uniche a livello globale, ma solo uniche tra i loro fratelli (che è permesso). All'interno di una "riga" la chiave è solo l'indice della colonna. Ciò significa che ogni cella nella colonna mostrerebbe l'errore.Potrei usare "rowId + colIndex" per "id" in 'errorsById', ma anche _that_ break, ad es. Se volevo rendere due copie della stessa griglia sulla pagina. Quindi "identità" qui diventa un problema non banale. Passare un callback alla funzione ajax per onError che imposta lo stato del componente direttamente è una pratica terribile? – Jonah

2

L'idea di conservare le informazioni sugli errori in un negozio va bene (probabilmente un ErrorStore). Ma il negozio non ha bisogno di conoscere il componente interessato a un particolare errore. Invece, lo ErrorStore deve emettere un evento CHANGE. Quando si emette quell'evento, è possibile aggiungere un argomento aggiuntivo, ovvero il tipo di errore (che presumibilmente il negozio riceve dal creatore dell'azione).

Ora, qualsiasi componente può ascoltare il ErrorStore e verificare il tipo di errore (che otterrà come argomento). I componenti possono quindi sapere quale tipo di errore è stato generato e decidere se sono interessati o meno.

+1

Questo è il tipo di percorso verso cui andare. Penso che sia il più diretto in termini di un modello di Flux. – Ryan

Problemi correlati