JSFiddle - React, Tailwind, and code Playground

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.22/vue.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vuetify@1.5.12/dist/vuetify.min.js"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/vuetify@1.5.12/dist/vuetify.min.css">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900|Material+Icons">
<div id="app">
  <v-app id="inspire">
    <v-layout column>
      <v-text-field style="max-height: 50px" type="search" v-model="searchCountry" label="search country"></v-text-field>
      <v-list>
        <v-list-group
          no-action
          sub-group
          v-for="country in filteredCountries"
          :key="country.id"
          @click="getRegions(country.id)"
        >
          <v-list-tile slot="activator">
            <v-list-tile-action>
              <v-checkbox :label="country.name"></v-checkbox>
            </v-list-tile-action>
          </v-list-tile>
          <v-text-field
            style="max-height: 50px; padding-left: 48px"
            type="search"
            v-model="country.searchRegion"
            label="search region"
          ></v-text-field>
          <v-list-group
            no-action
            sub-group
            v-for="region in filteredItems(country.searchRegion, country.regions)"
            :key="region.id"
            @click="getCities(region.id, country.id)"
          >
            <v-list-tile slot="activator">
              <v-list-tile-action>
                <v-checkbox :label="region.name"></v-checkbox>
              </v-list-tile-action>
            </v-list-tile>
            <v-text-field
              style="max-height: 50px; padding-left: 72px"
              type="search"
              v-model="region.searchCity"
              label="search city"
            ></v-text-field>
            <v-list-tile v-for="city in filteredItems(region.searchCity, region.cities)" :key="city.id">
              <v-list-tile-action>
           ...

JavaScript

new Vue({
  el: '#app',
  data: () => ({
    geography: [
      'Russia',
      'USA',
      'Germany',
      'Italy',
      'China',
    ].map((name, i) => ({ name, id: i + 1 })),
    searchCountry: '',
  }),
  computed: {
    filteredCountries() {
      return this.filteredItems(this.searchCountry, this.geography);
    },
  },
  methods: {
    filteredItems(search, array) {
      search = (search || '').toLowerCase();

      return search && array
        ? array.filter(item => item.name.toLowerCase().includes(search))
        : array;
    },
    getRegions(id) {
      const country = this.geography.find(item => item.id === id);
      if (!country.regions) {
        this.$set(country, 'regions', [{'name':'Region1', 'id': 0}, {'name':'Region2', 'id': 1}]);
      }
    },
    getCities(idRegion, idCountry) {
      const
        country = this.geography.find(item => item.id === idCountry),
        region = country.regions.find(item => item.id === idRegion);

      if (!region.cities) {
        this.$set(region, 'cities', [{'name':'City1', 'id': 0}, {'name':'City2', 'id': 1}]);
      }
    },
  },
});