JSFiddle - React, Tailwind, and code Playground
HTML
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.6.10/vue.js"></script>
<div id="app">
<country-info v-for="n in countries" v-bind="n"></country-info>
</div>
<template id="country">
<div class="country">
<div class="title">{{ country }}</div>
<region-info v-for="n in regions" v-bind="n"></region-info>
</div>
</template>
<template id="region">
<div class="region">
<div class="title">{{ region }}</div>
<city-info v-for="n in cities" v-bind="n"></city-info>
</div>
</template>
<template id="city">
<div class="city">
<div class="title">{{ city }}</div>
<div>{{ coord }}</div>
</div>
</template>
CSS
.country {
margin: 10px;
padding: 10px;
border: 1px solid #000;
}
.region {
margin: 5px;
padding: 5px;
border: 1px solid #666;
}
.city {
margin: 5px;
padding: 5px;
border: 1px solid #ccc;
}
.title {
font-weight: bold;
}
JavaScript
Vue.component('country-info', {
template: '#country',
props: [ 'country', 'regions' ],
});
Vue.component('region-info', {
template: '#region',
props: [ 'region', 'cities' ],
});
Vue.component('city-info', {
template: '#city',
props: [ 'city', 'coord' ],
});
new Vue({
el: '#app',
data: {
countries: [
{
country: 'Россия',
regions: [
{
region: 'Московская область',
cities: [
{
city: 'Москва',
coord: [55.751244, 37.618423]
},
{
city: 'Балашиха',
coord: [37.9679867, 55.7981904]
},
]
}
]
},
{
country: 'США',
regions: [
{
region: 'Калифорния',
cities: [
{
city: 'Лос-Анджелес',
coord: [34.052235, -118.243683]
},
{
city: 'Сакраменто',
coord: [38.575764, -121.478851]
}
]
},
{
region: 'Теннесси',
cities: [
{
city: 'Нэшвилл',
coord: [36.174465, -86.767960]
}
]
}
]
}
]
}
});