Vue Simple Component

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.18.0/axios.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vuex/3.0.1/vuex.min.js"></script>
<div id="app">
  <div v-for="(field, index) in getFields" :key="index"> 
    <dropdown
      v-if="!field.depend || formData[field.depend]"
      :id="field.id"
      v-model="field.value"
      :options="getOptions(field)"
      default-value="Make a choice"
      show-search="true"
      input-placeholder="Выберите"
    />
  </div>

</div>

Babel + JSX

const store = new Vuex.Store({
    state: {
        fields: []
    },
    getters: {
    	getFields(state) {
      	return state.fields.map(n => ({ ...n, value: '' }))
      }
    },
    mutations: {
        setFields(state, payload) {
            state.fields = payload
            console.log(state.fields)
        }
    },
    actions: {
        getData({ commit }) {
            axios.get('https://api.myjson.com/bins/q9pu2').then(response => {
              commit('setFields', response.data.formFields)
            }).catch(errors => {
              console.error(errors);
            });
        }
    }
})
Vue.component('dropdown', {
  template: `
  <div>
        <div class="vue-dropdown" :class="{'vue-active':toggle}">
            <span @click="toggle = !toggle">{{ value.length ? value : defaultValue }}</span>
            <div class="vue-dropdown-collapsed" v-if="this.toggle">
                <input type="text" v-model="search" v-if="showSearch === 'true'" :placeholder="inputPlaceholder" @click="toggle == true">
                <ul>
                    <li v-for="(option, index) in options" :key="index" @click="update(option)" v-if="option.name.toLowerCase().indexOf(search.toLowerCase()) !== -1">{{ option.name }}</li>
                </ul>
            </div>
        </div>
    </div>
`,
  props: [ 'value', "options", "defaultValue", "showSearch", "inputPlaceholder" ],
  data() {
    return {
      toggle: false,
      search: ""
    };
  },
  watch: {
    toggle: function (val) {
      if(val) {
        this.$emit('open');
      } else {
        this.search = '';
      }
    },
  },
  methods: {
    update(option) {
      this.toggle = false
      this.$emit('input', option.name)
    }
  }
});

new Vue({
  el: '#app',
  store,
  data: {
    dependentData: {},
    allFields: []
  },
  methods: {
    getOptions(field) {
      if (!field.depend) {
        return field.fields;
      }

      return (this.dependentData[field.depend] || {})[field.name] || [];
    }
 ...