@@ -8,6 +8,8 @@ import Button from "@/Component/Button/Button.vue";
8
8
import " vue-range-slider/dist/vue-range-slider.css" ;
9
9
import RangeSlider from " vue-simple-range-slider" ;
10
10
import " vue-simple-range-slider/css" ;
11
+ import { useRoute } from ' vue-router' ;
12
+
11
13
12
14
const map = ref (null ); // Kakao Map 객체
13
15
const polygons = ref ([]); // 생성된 폴리곤 객체 배열
@@ -170,9 +172,18 @@ const fetchData = async (type) => {
170
172
171
173
};
172
174
175
+ const route = useRoute ();
176
+ // params로 전달된 "param" 값
177
+
178
+
179
+ // 문자열로 변환된 buildingUse
180
+ const buildingUse = route .params .param ;
181
+
182
+ console .log (' 전달된 파라미터:' , buildingUse); // 디버깅용
183
+
173
184
onMounted (async () => {
174
185
isLoading .value = false ;
175
- await fetchData (" 아파트 " ); // 데이터 로드
186
+ await fetchData (buildingUse ); // 데이터 로드
176
187
isLoading .value = true ;
177
188
});
178
189
@@ -184,18 +195,17 @@ watch(
184
195
{ immediate: true } // 즉시 실행
185
196
);
186
197
187
-
188
198
// store에서 houseInfos 가져오기
189
199
const houseInfos = computed (() => houseInfoStore .houseInfos );
190
200
191
201
// DOMContentLoaded 이벤트는 HTML 문서의 모든 콘텐츠가 완전히 로드되었을 때 발생함
192
202
document .addEventListener (" DOMContentLoaded" , () => {
203
+
193
204
const filterButton = document .getElementById (" filterButton" );
194
205
const rangeSlider = document .getElementById (" rangeSlider" );
195
206
196
207
// 이제 filterButton이 존재하므로 이벤트 리스너를 안전하게 추가할 수 있습니다.
197
208
filterButton .addEventListener (" click" , () => {
198
- console .log (" 클릭" );
199
209
if (rangeSlider .classList .contains (" hidden" )) {
200
210
rangeSlider .classList .remove (" hidden" );
201
211
} else {
@@ -204,14 +214,42 @@ document.addEventListener("DOMContentLoaded", () => {
204
214
});
205
215
});
206
216
207
- // 슬라이더 값을 반응형으로 관리
208
217
const state = reactive ({
209
- value: [10 , 100 ],
210
- value2: [10 , 100 ]
218
+ 가격: [0 , 10000000 ], // 초기값
219
+ 면적: [0 , 10000000 ],
220
+ 사용승인일: [0 , 10000000 ],
221
+ 층수: [0 , 10000000 ],
211
222
});
212
223
213
- </script >
224
+ const isSliderVisible = ref (" " ); // 현재 열려 있는 슬라이더 필터 이름
225
+
226
+ const toggleSlider = (filter ) => {
227
+ if (isSliderVisible .value === filter) {
228
+ // 이미 열려 있는 슬라이더를 클릭하면 닫음
229
+ isSliderVisible .value = " " ;
230
+ } else {
231
+ // 다른 슬라이더를 클릭하면 현재 슬라이더를 열고, 나머지는 닫음
232
+ isSliderVisible .value = filter;
233
+ }
234
+ };
214
235
236
+ const applyFilter = () => {
237
+ for (const [key , value ] of Object .entries (state)) {
238
+ console .log (` ${ key} : ${ value[0 ]} ~ ${ value[1 ]} ` );
239
+ // console.log(`${value[0]}`)
240
+ }
241
+ };
242
+
243
+ const initFilter = () => {
244
+ for (const [key , value ] of Object .entries (state)) {
245
+ value[0 ] = 0 ;
246
+ value[1 ] = 10000000 ;
247
+ console .log (` ${ key} : ${ value[0 ]} ~ ${ value[1 ]} ` );
248
+ // console.log(`${value[0]}`)
249
+ }
250
+ }
251
+
252
+ </script >
215
253
216
254
<template >
217
255
<div class =" flex flex-row items-center w-full h-[100vh] pt-20" >
@@ -251,63 +289,77 @@ const state = reactive({
251
289
252
290
<!-- 지도 및 필터 영역 -->
253
291
<div class =" flex flex-col justify-start w-full h-full" >
254
-
255
292
<!-- 필터 전체 버튼 -->
256
293
<div class =" flex flex-row items-center py-4 h-14 border-b border-gray-200" >
257
-
258
294
<!-- 검색 창-->
259
295
<div class =" relative w-[370px] ml-4 mr-2" >
260
296
<input
261
297
type =" text"
262
298
placeholder =" 찾고자하는 아파트 이름을 입력하세요"
263
- class =" w-full h-8 px-4 pr-10 text-sm text-gray-700 border border-gray-300 rounded-lg shadow-sm focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:border-indigo-500"
264
- />
299
+ class =" w-full h-8 px-4 pr-10 text-sm text-gray-700 border border-gray-300 rounded-lg shadow-sm focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:border-indigo-500" />
300
+ <button
301
+ type =" button"
302
+ class =" absolute inset-y-0 right-0 flex items-center px-3 text-gray-500 hover:text-gray-700" >
303
+ <svg
304
+ class =" w-4 h-4"
305
+ aria-hidden =" true"
306
+ xmlns =" http://www.w3.org/2000/svg"
307
+ fill =" none"
308
+ viewBox =" 0 0 20 20" >
309
+ <path
310
+ stroke =" currentColor"
311
+ stroke-linecap =" round"
312
+ stroke-linejoin =" round"
313
+ stroke-width =" 2"
314
+ d =" M19 19l-4-4m0-7A7 7 0 1 1 1 8a7 7 0 0 1 14 0Z" />
315
+ </svg >
316
+ </button >
317
+ </div >
318
+
319
+ <div v-for =" (filter, index) in filters" :key =" index" class =" relative inline-block text-left ml-2" >
320
+ <!-- 버튼 -->
265
321
<button
266
322
type =" button"
267
- class =" absolute inset-y-0 right-0 flex items-center px-3 text-gray-500 hover:text-gray-700" >
268
- <svg
269
- class =" w-4 h-4"
270
- aria-hidden =" true"
271
- xmlns =" http://www.w3.org/2000/svg"
272
- fill =" none"
273
- viewBox =" 0 0 20 20" >
274
- <path
275
- stroke =" currentColor"
276
- stroke-linecap =" round"
277
- stroke-linejoin =" round"
278
- stroke-width =" 2"
279
- d =" M19 19l-4-4m0-7A7 7 0 1 1 1 8a7 7 0 0 1 14 0Z" />
280
- </svg >
323
+ @click =" toggleSlider(filter)"
324
+ class =" flex flex-row items-center w-full h-8 border border-gray-300 shadow-sm pl-2 text-xs font-medium text-gray-700 hover:bg-gray-50 focus:outline-none" >
325
+ <div >{{ filter }}</div >
326
+ <svg
327
+ class =" h-4 w-6 text-gray-800"
328
+ xmlns =" http://www.w3.org/2000/svg"
329
+ viewBox =" 0 0 20 20"
330
+ fill =" currentColor"
331
+ aria-hidden =" true" >
332
+ <path
333
+ fill-rule =" evenodd"
334
+ d =" M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 011.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z"
335
+ clip-rule =" evenodd"
336
+ />
337
+ </svg >
281
338
</button >
282
- </div >
283
-
284
- <div v-for =" (filter, index) in filters" :key =" index" class =" relative inline-block text-left ml-2" >
285
- <!-- 버튼 -->
286
- <button id =" filterButton" type =" button"
287
- class =" flex flex-row items-center w-full h-8 border border-gray-300 shadow-sm pl-2 text-xs font-medium text-gray-700 hover:bg-gray-50 focus:outline-none" >
288
- <div > {{ filter }} </div >
289
- <svg class =" h-4 w-6 text-gray-800" xmlns =" http://www.w3.org/2000/svg" viewBox =" 0 0 20 20" fill =" currentColor" aria-hidden =" true" >
290
- <path fill-rule =" evenodd" d =" M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 011.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z" clip-rule =" evenodd" />
291
- </svg >
339
+ <!-- 슬라이더 -->
340
+ <div
341
+ v-if =" isSliderVisible === filter"
342
+ class =" absolute z-10 w-[220px] top-10 left-0 border-2 border-gray-200 bg-white" >
343
+ <RangeSlider
344
+ v-model =" state[filter]"
345
+ style =" width : 100% "
346
+ exponential
347
+ :max =" 1000000000" >
348
+ <template #suffix >만원</template >
349
+ </RangeSlider >
350
+ <div class =" flex flex-row justify-end" >
351
+ <button class =" bg-blue-600 rounded-lg mb-2 mx-2 p-2 text-white text-xs" @click =applyFilter >
352
+ 적용
292
353
</button >
293
- <!-- 아이콘 -->
294
- <div
295
- class =" bg-white absolute z-10 w-[200px] h-[120px] top-10 left-0 border-2 border-gray-200"
296
- v-if =" isSliderVisible" >
297
- <RangeSlider
298
- v-model =" state.value"
299
- style =" width : 100% "
300
- exponential
301
- :max =" 1000000000" >
302
- <template #suffix >만원</template >
303
- </RangeSlider >
304
- <span >{{ state.value[0] }} 만원</span > -
305
- <span >{{ state.value[1] }} 만원</span >
306
- </div >
354
+ </div >
355
+ <!-- <div class="flex flex-row justify-between bg-blue-400 px-4">
356
+ <span class="">{{ state[filter][0] }}만원</span>
357
+ <span class="">{{ state[filter][1] }}만원</span>
358
+ </div> -->
307
359
</div >
308
-
360
+ </ div >
309
361
<button type =" button" class =" relative inline-block text-left ml-2 h-8 px-2 py-2 bg-white border border-gray-300 shadow-sm focus:ring-indigo-500" >
310
- <svg class =" h-4 w-4" xmlns =" http://www.w3.org/2000/svg" fill =" currentColor" viewBox =" 0 0 24 24" >
362
+ <svg class =" h-4 w-4" xmlns =" http://www.w3.org/2000/svg" fill =" currentColor" viewBox =" 0 0 24 24" @click = " initFilter " >
311
363
<path d =" M12 4V1L8 5l4 4V6c3.31 0 6 2.69 6 6s-2.69 6-6 6-6-2.69-6-6H4c0 4.42 3.58 8 8 8s8-3.58 8-8-3.58-8-8-8z" />
312
364
</svg >
313
365
</button >
@@ -325,30 +377,7 @@ const state = reactive({
325
377
<!-- 목록 영역 추가할 수 있습니다 -->
326
378
<div class =" p-2 overflow-auto" >
327
379
<div class =" text-center mt-2" >
328
- <!-- <span>최소: {{ state.value[0] }} 만원</span> -
329
- <span>최대: {{ state.value[1] }} 만원</span>
330
-
331
- <span>최소: {{ state.value2[0] }} 만원</span> -
332
- <span>최대: {{ state.value2[1] }} 만원</span> -->
333
- <!-- <RangeSlider
334
- v-model="state.value"
335
- style="width: 100%"
336
- exponential
337
- :max="1000000000"
338
- >
339
- <template #suffix>만원</template>
340
- </RangeSlider> -->
341
-
342
- <RangeSlider
343
- v-model =" state.value2"
344
- style =" width : 100% "
345
- exponential
346
- :max =" 1000000000"
347
- >
348
- <template #suffix >만원</template >
349
- </RangeSlider >
350
- </div >
351
-
380
+ </div >
352
381
<div v-for =" house in houseInfos" :key =" house.id" >
353
382
<CardView
354
383
:id =" house.id"
@@ -379,8 +408,6 @@ const state = reactive({
379
408
</div >
380
409
</template >
381
410
382
-
383
-
384
411
<style >
385
412
.polygon-label {
386
413
background : white ;
0 commit comments