선택한 강아지 종류에 따라 서브 종류와 이미지를 가져오도록 되어 있습니다. 위의 예제 코드를 실행하면 각 단계에서 옵션을 선택할 수 있고, 선택에 따라 다음 단계의 옵션이 동적으로 변경됩니다.
https://dog.ceo/api/breeds 를 활용하여 3단계 동적 select 박스를 만든 예제 입니다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Vue.js를 이용한 동적 드롭다운</title>
<!-- Vue.js CDN 추가 -->
<script src="https://cdn.jsdelivr.net/npm/vue@2"></script>
</head>
<body>
<div id="app">
<select name="step1" v-model="selectedStep1" v-on:change="fetchStep2Options">
<option value="">단계 1 선택</option>
<option v-for="breed in breeds" :value="breed.id">{{ breed.name }}</option>
</select>
<select name="step2" v-model="selectedStep2" v-on:change="fetchStep3Options" v-show="true">
<option value="">단계 2 선택</option>
<option v-for="subBreed in subBreeds" :value="subBreed">{{ subBreed }}</option>
</select>
<select name="step3" v-model="selectedStep3" v-show="true">
<option value="">단계 3 선택</option>
<option v-for="image in images" :value="image">{{ image }}</option>
</select>
<br><br><br>
<!-- 이미지를 보여주는 부분 -->
<img v-if="selectedStep3" :src="selectedStep3" alt="선택된 이미지">
</div>
<script>
new Vue({
el: '#app',
data: {
selectedStep1: '',
selectedStep2: '',
selectedStep3: '',
breeds: [],
subBreeds: [],
images: []
},
methods: {
async fetchStep1Options() {
const response = await fetch('https://dog.ceo/api/breeds/list/all')
const data = await response.json();
this.breeds = Object.keys(data.message).map(breed => ({
id: breed,
name: breed
}));
if (this.selectedStep1) {
this.fetchStep2Options();
}
},
async fetchStep2Options() {
this.images = []; // 이미지 초기화
if (this.selectedStep1) {
const response = await fetch(`https://dog.ceo/api/breed/${this.selectedStep1}/list`)
const data = await response.json();
this.subBreeds = data.message;
if (!this.subBreeds.includes(this.selectedStep2)) {
this.selectedStep2 = '';
this.selectedStep3 = '';
} else {
this.fetchStep3Options();
}
} else {
this.selectedStep2 = '';
this.selectedStep3 = '';
}
},
async fetchStep3Options() {
this.images = [];
if (this.selectedStep2) {
const response = await fetch(`https://dog.ceo/api/breed/${this.selectedStep1}/${this.selectedStep2}/images/random/10`)
const data = await response.json();
this.images = data.message;
if (!this.images.includes(this.selectedStep3)) {
this.selectedStep3 = '';
}
} else {
this.selectedStep3 = '';
}
}
},
async mounted() {
this.selectedStep1 = 'pointer';
this.selectedStep2 = 'germanlonghair';
this.selectedStep3 = 'https://images.dog.ceo/breeds/pointer-german/n02100236_3798.jpg';
await this.fetchStep1Options();
}
});
</script>
</body>
</html>