본문 바로가기
vue

다중셀렉트

by uni:D 2024. 9. 10.
반응형

https://apollo.primevue.org/uikit/input

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
<template>
  <div>
    <div v-for="(item, index) in items" :key="item.id" class="checkbox-item">
      <input
        type="checkbox"
        :id="item.id"
        :checked="item.checked"
        @change="handleChange(item.id, $event.target.checked)"
      />
      <label :for="item.id">{{ item.label }}</label>
    </div>
    <div class="selected-list">
      <div v-for="(item, index) in selectedItems" :key="item.id" class="selected-item">
        <input
          type="checkbox"
          :id="'selected-' + item.id"
          :checked="item.checked"
          @change="handleSelectedChange(item.id, $event.target.checked)"
        />
        <label :for="'selected-' + item.id">{{ item.label }}</label>
      </div>
    </div>
  </div>
</template>
 
<script setup>
import { ref, computed } from 'vue';
 
const items = ref([
  { id: 1, label: 'Item 1', checked: false },
  { id: 2, label: 'Item 2', checked: false },
  { id: 3, label: 'Item 3', checked: false },
]);
 
const selectedItems = ref([]);
 
const handleChange = (id, checked) => {
  // `items` 배열에서 선택된 항목의 인덱스를 찾습니다.
  const itemIndex = items.value.findIndex(item => item.id === id);
  
  // `itemIndex`가 -1이 아니면, 즉, 항목이 배열에 존재하면
  if (itemIndex !== -1) {
    items.value[itemIndex].checked = checked; // 해당 항목의 체크 상태를 업데이트합니다.
    
    if (checked) {
      // 체크된 경우, `selectedItems` 배열에 해당 항목을 추가합니다.
      selectedItems.value.push(items.value[itemIndex]);
    } else {
      // 체크 해제된 경우, `selectedItems` 배열에서 해당 항목을 삭제합니다.
      const selectedIndex = selectedItems.value.findIndex(item => item.id === id);
      if (selectedIndex !== -1) {
        selectedItems.value.splice(selectedIndex, 1);
      }
    }
  }
};
 
const handleSelectedChange = (id, checked) => {
  // `selectedItems` 배열에서 선택된 항목의 인덱스를 찾습니다.
  const itemIndex = selectedItems.value.findIndex(item => item.id === id);
  
  // `itemIndex`가 -1이 아니면, 즉, 항목이 배열에 존재하면
  if (itemIndex !== -1) {
    selectedItems.value[itemIndex].checked = checked; // 해당 항목의 체크 상태를 업데이트합니다.
    
    if (!checked) {
      // 체크 해제된 경우, `selectedItems` 배열에서 해당 항목을 삭제합니다.
      selectedItems.value.splice(itemIndex, 1);
      
      // 원래 `items` 배열에서 해당 항목의 체크 상태를 해제합니다.
      const originalIndex = items.value.findIndex(item => item.id === id);
      if (originalIndex !== -1) {
        items.value[originalIndex].checked = false;
      }
    }
  }
};
</script>
 
<style scoped>
.checkbox-item {
  margin-bottom: 5px;
}
.selected-list {
  margin-top: 10px;
}
.selected-item {
  margin-bottom: 5px;
}
</style>
 
cs
반응형

'vue' 카테고리의 다른 글

quasar flex기준 왼쪽 오른쪽일때  (0) 2024.08.05
:class  (0) 2024.08.04
레이어팝업  (0) 2024.08.02
방향에 따른 툴팁 tooltip  (0) 2024.08.02
클릭시 상단 push  (1) 2024.08.02