2017-08-02 3 views
0

私は、複雑な動的フォーム(たくさんのフィールド)を持つWebページを構築しています。可読性とメンテナンスのために、よりクリーンで短くしたいと思っています。 はこの場合、私は、例えば、このクリーナーフォームの検証コード[React Redux Thunk]?

のような複雑なフォームの検証を処理するためのより良い方法があるはずのように、ここでは、私のコードのいくつかであると感じた

// 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...
については

自分の行動の作成者

// 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... 
 
    } 
 
}

あなたが見ることができるように、それは(多分?)かなり厄介だだけフォーム検証コンポーネントの、reducerピュアcontainer残るべき唯一のため、すべてのロジックを処理するためにaction creatorを残して、それはdoesnの、データを渡します。私の場合は良く見えません。

この種のケースに遭遇した場合、どうすればコードをきれいに保つことができますか?

答えて

0

Reduxの例は、明確にするために非常に具体的な傾向がありますが、より一般的なアクション作成者を使用できない理由はありません。例えば

、代わりに単一の値のフォームフィールドごとに、アクションの作成者を持つのは、このような一つだけ持つことができます。

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

を、後であなたがこの

のようなアクションの作成者を呼び出すことができます
dispatch(updateField('gender', 'male')) 

(リデューサーの更新も忘れないでください)

多値フォームフィールドの追加、削除、消去のために、同様の汎用アクションクリエータを作成できます。

これを行うことの1つの欠点は、アクションログがわかりにくいということですが、一般的に問題はありません。

関連する問題