2017-08-02 1 views
0

Je construis une page web qui a une forme dynamique complexe (beaucoup de champs), je veux garder les choses plus propres et plus courtes pour des raisons de lisibilité et de maintenance. Dans ce cas, je me sentais comme il devrait y avoir une meilleure façon de gérer la validation de forme complexe comme celui-ciCode de validation du formulaire de nettoyage [React Redux Thunk]?

Par exemple, voici quelques-uns de mes codes,

// reducer.js 
 
// Let's create our initial employee state for our reducer 
 

 
initialState = { 
 
    id: null, 
 
    name: '', 
 
    gender: '', 
 
    email: '', 
 
    role: '', 
 
    address: '', 
 
    phoneNumber: '', 
 
    experiences: [ // Array of experiences (Appendable) 
 
    { 
 
     id: null, 
 
     description: '', 
 
     error: null // Every item has it's own error value 
 
    } 
 
    ], 
 
    errors: { // Error value for every single field 
 
    name: null, 
 
    gender: null, 
 
    email: null, 
 
    role: null, 
 
    address: null, 
 
    phoneNumber: null 
 
    } 
 
} 
 

 
// Lot of switch cases here...

En ce qui concerne mon créateur d'action

// Actions.js 
 
// I'll create bunch of actions that dispatch to reducer 
 
const updateName = (value) => { 
 
    return { 
 
    type: UPDATE_NAME, 
 
    value: value 
 
    } 
 
} 
 

 
const updateGender = (value) => { 
 
    return { 
 
    type: UPDATE_GENDER, 
 
    value: value 
 
    } 
 
} 
 

 
// and so on.., even for the error value 
 

 
const updateError = (bodyType, value) => { 
 
    return { 
 
    type: UPDATE_ERROR, 
 
    bodyType: bodyType, 
 
    value: value 
 
    } 
 
} 
 

 
// Then, I'll export methods for my container component 
 
export const onUpdateName = (value) => { 
 
    return (dispatch) => { 
 
    const nameError = validateName(value); // custom validation method 
 
    dispatch(updateError(nameError)); 
 
    dispatch(updateName(value)); 
 
    } 
 
} 
 

 

 
// And more functions... 
 

 
// And when the user hit SUBMIT 
 
export const onSubmit =() => { 
 
    return (dispatch, getState) => { 
 
    const employeeInfo = getState().employeeReducer; 
 
    if (employeeInfo.errors.name || employee.errors.gender) { 
 
     // Checking every item in the object of errors, if error found, return 
 
     return; 
 
    } 
 
    
 
    // Passed the validation, do something else... 
 
    } 
 
}

Comme vous pouvez le voir, il est tout à fait désordre (peut-être?) Pour un composant de validation de formulaire uniquement, le reducer doit rester pur et ne laisse passer que container les données, laissant ainsi le action creator pour gérer toutes les logiques et doesn Je n'ai pas l'air bien dans mon cas.

Comment gardez-vous votre code propre si vous avez déjà rencontré ce genre de cas?

Répondre

0

Les exemples Redux ont tendance à être assez spécifiques pour apporter de la clarté, mais il n'y a aucune raison de ne pas pouvoir utiliser des créateurs d'actions plus généraux.

Par exemple, au lieu d'avoir un créateur d'action pour chacun des champs de formulaire de valeur unique, vous pouvez avoir un seul comme ceci:

const updateField = (field, value) => { 
    return { 
    type: UPDATE_FIELD, 
    field: field, 
    value: value 
    } 
} 

et plus tard, vous pouvez appeler le créateur d'action comme celui-ci

dispatch(updateField('gender', 'male')) 

(n'oubliez pas de mettre à jour votre réducteur).

Vous pouvez créer des créateurs d'action universels similaires pour les erreurs et pour ajouter/supprimer/effacer les champs de formulaire à valeurs multiples. Le seul inconvénient de faire ceci est que votre journal d'action ne sera pas aussi lisible - bien qu'il ne soit généralement pas un problème.