ASENKRON MODÜLLER

VERİYİ MODELLEME

​HATA YÖNETİMİ

Vuex ve Efektif Kullanımı

2018 - Frontend Istanbul

Abdullah MARA

Başlamadan Önce,

Asenkron Çağrıları Yönetme

Teşekkürler Altay Aydemir

Her aksiyon icin;

 

3 Type

3 Mutations

4 State

1* Getter

STATE


        export const driverGroupState = {
          list: {
            isLoading: false,
            isLoaded: false,
            data: [],
            errors: {}
          }
        };

TYPES



        export const types = {
          INDEX: {
            REQUEST: 'DRIVER_GROUPS/INDEX_REQUEST',
            SUCCESS: 'DRIVER_GROUPS/INDEX_SUCCESS',
            FAILURE: 'DRIVER_GROUPS/INDEX_FAILURE'
          }
        };

GETTER


   
        export const getters = {
          DriverGroups: state => state.list
        };

MUTATION




        export const mutations = {
          [types.INDEX.REQUEST](state) {
            state.list = {
              ...state.list,
              isLoading: true,
              errors: {}
            };
          },
          [types.INDEX.SUCCESS](state, payload) {
            state.list = {
              isLoading: false,
              isLoaded: true,
              data: payload.data,
              errors: {}
            };
          },
          [types.INDEX.FAILURE](state, payload) {
            state.list = {
              isLoading: false,
              isLoaded: false,
              data: [],
              errors: payload.error
            };
          }
        };

ACTION


    async getDriverGroups({ commit }) {
      commit({ type: types.INDEX.REQUEST });
      try {
        const res = await getDriverGroups();
        commit({ type: types.INDEX.SUCCESS, payload: { data: res.data } });
      } catch (error) {
        commit({ type: types.INDEX.FAILURE, payload: { error } });
      }
    }
    /* eslint-disable no-param-reassign */
    import { getDriverGroups } from '@/api/DriverGroups';
    
    export const types = {
      INDEX: {
        REQUEST: 'DRIVER_GROUPS/INDEX_REQUEST',
        SUCCESS: 'DRIVER_GROUPS/INDEX_SUCCESS',
        FAILURE: 'DRIVER_GROUPS/INDEX_FAILURE'
      }
    };
    
    export const driverState = {
      list: {
        isLoading: false,
        isLoaded: false,
        data: [],
        errors: {}
      }
    };
    
    export const getters = {
      DriverGroups: state => state.list
    };
    
    export const mutations = {
      [types.INDEX.REQUEST](state) {
        state.list = {
          ...state.list,
          isLoading: true,
          errors: {}
        };
      },
      [types.INDEX.SUCCESS](state, payload) {
        state.list = {
          isLoading: false,
          isLoaded: true,
          data: payload.data,
          errors: {}
        };
      },
      [types.INDEX.FAILURE](state, payload) {
        state.list = {
          isLoading: false,
          isLoaded: false,
          data: [],
          errors: payload.error
        };
      }
    };
    
    export default {
      state: driverState,
      getters,
      mutations,
      actions: {
        async getDriverGroups({ commit }) {
          commit({ type: types.INDEX.REQUEST });
          try {
            const res = await getDriverGroups();
            commit({ type: types.INDEX.SUCCESS, payload: { data: res.data } });
          } catch (error) {
            commit({ type: types.INDEX.FAILURE, payload: { error } });
          }
        }
      }
    };
    

8 Modül'ü tek bir komponentin kullanması

😱

VERİYİ MODELLEME

Neden? Ne demek?

Verinin Görselleştirilmesi,

Jenerik alanlar, Form'lar

Fazlalıklardan kurtulma

import { pick } from 'lodash';

export class DynamicFieldsModel {
  static validationRules = {
    name: { required: true },
    dynamicFieldDataTypeId: { required: true },
    dynamicFieldSourceTypeId: { required: true },
    dynamicFieldSource: { required: true },
    label: { required: true }
  };

  constructor(data = {}, fieldList = []) {
    this.data = data;
    this.model = this.getModel();
    const formModel = this.getModel();
    formModel.fields = fieldList.find(f => f.id === formModel.dynamicFieldGroupId);
    this.form = formModel;
  }

  getModel() {
    return pick(this.data, [
      'id',
      'dynamicFieldGroupId',
      'dynamicFieldDataTypeId',
      'name',
      'label',
      'fieldOrder',
      'dynamicFieldSourceTypeId',
      'dynamicFieldSource',
      'isActive',
      'changedBy',
      'changedAt'
    ]);
  }
}

export default {
  DynamicFieldsModel
};

    
        
        
        
            <!--  -->
            <b-select placeholder="Data Type"
                      name="datatype"
                      expanded
                      v-validate="DynamicFieldsModel.validationRules.dynamicFieldDataTypeId"
                      :loading="DynamicFieldDataTypes.list.isLoading"
                      v-model="form.dynamicFieldDataTypeId">
              <option v-for="option in DynamicFieldDataTypes.list.data"
                      :value="option.id"
                      :key="option.id">
                {{ option.name }}
              </option>
            </b-select>
            <!--  -->

ERROR HANDLING


   
   const errorHandler = store => {
      store.subscribe(mutation => {
        const { type, payload } = mutation;
        if (payload && payload.error) {
         // Do this
        }
      });
    };

FE-2018

By Abdullah Mara

FE-2018

  • 265