Vue Simple Component

HTML

<div id="app">

  <div v-for="(field, index) in formFields" :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

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',
  data: {
    dependentData: {},
    formFields: [ {
      name: 'brand',
      type: 'select',
      fields: [
        { id: 0, name: 'audi', value: 'audi' },
        { id: 1, name: 'bmw', value: 'bmw' },
        { id: 2, name: 'feat', value: 'feat' },
        { id: 3, name: 'shkoda', value: 'shkoda' },
        { id: 4, name: 'MB', value: 'MB' },
        { id: 5, name: 'seat', value: 'seat' },
        { id: 6, name: 'mazda', value: 'mazda' },
      ]
    }, {
      name: 'model',
      type: 'select',
      depend: 'brand',
    }, {
      name: 'country',
      type: 'select',
      depend: 'brand',
    } ].map(n => ({ ...n, value: '' })),
  },
  methods: {
    getOptions(field) {
      if (!field.depend) {
        return field.fields;
      }

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