프로젝트/Digital Twin Bootcamp

[Team 제주 넘는 차] 체크박스 '전체' 항목 로직

2022. 3. 3. 15:58

요구 사항

1. 체크박스 중 '전체' 항목의 경우, 다른 항목들 중 하나라도 체크 해제 되면 체크가 해제 되어야 하고, '전체'에 체크 되면 모든 항목에 체크가 되어야 한다.

2. '전체' 항목에 체크 해제되면 모든 항목이 체크 해제 되어야 하고 체크되면 모든 항목이 체크 되어야 함

 

1번부터 코드를 짰다.

reduce()를 이용해 구현했다.

// views/main.vue

// ...

<script>
export default {
  data: function () {
    return {
      ranks: [
        {
          name: '경형',
          value: true
        },
        {
          name: '소형',
          value: true
        },
        {
          name: '중형',
          value: true
        },
        {
          name: '대형',
          value: true
        },
        {
          name: '수입',
          value: true
        },
        {
          name: '승합RV',
          value: true
        },
        {
          name: 'SUV',
          value: true
        }
      ],
      
// ...

allRanks: true, // '전체' 체크박스 값

// ...

computed: {
    allRanksCheck() {
      const result = this.ranks.reduce((count, data) => (data['value'] === true ? count + 1 : count), 0)
      // console.log(result)
      if (result >= 7) {
        // console.log('전체 체크 true')
        return (this.allRanks = true)
      } else if (result < 7) {
        // console.log('전체 체크 해제')
        return (this.allRanks = false)
      }
    },
    
// ...

  watch: {
    allRanksCheck() {}
  },
  
// ...

ranks 안에 있는 value가 true일 경우를 count하여 count 값이 7 이상일 경우 전체 체크 true, 7 미만일 경우 전체 체크 false가 되게 구현했다.

computed에 함수를 짜고 watch에서 값이 실시간으로 변할 때 감지할 수 있도록 짰다. computed로 구현 가능하면 watch를 안쓰는게 좋다고 들었는데(watch의 경우 꼬이면 답이 없음) 원리를 아직 완벽히 이해하진 못했다.

설명

 

결과

모든 항목에 체크 되어 있으면 전체에도 체크 됨
하나라도 체크 해제되면 전체도 체크 해제됨

 

 

2번

// ...

        <div><input v-model="allRanks" type="checkbox" @click="selectAllRanks()" /><label>전체</label></div>
          <div v-for="(rank, index) in ranks" :key="index">
            <input v-model="rank.value" type="checkbox" name="ranks" /><label>{{ rank.name }}</label>
          </div>
        </div>
        <div class="fuel">
          <h2 class="sub">연료</h2>
          <div><input v-model="allFuels" type="checkbox" @click="selectAllFuels()" /><label>전체</label></div>
          <div v-for="(fuel, index) in fuels" :key="index">
            <input v-model="fuel.value" type="checkbox" name="fuels" /><label>{{ fuel.name }}</label>
          </div>
        </div>
      </div>

// ...

</template>
<script src="https://cdn.jsdelivr.net/vue/2.0.3/vue.js"></script>
<script>
export default {
  data: function () {
    return {
      ranks: [
        {
          name: '경형',
          value: true
        },
        {
          name: '소형',
          value: true
        },
        {
          name: '중형',
          value: true
        },
        {
          name: '대형',
          value: true
        },
        {
          name: '수입',
          value: true
        },
        {
          name: '승합RV',
          value: true
        },
        {
          name: 'SUV',
          value: true
        }
      ],
      fuels: [
        {
          name: '휘발유',
          value: true
        },
        {
          name: '경유',
          value: true
        },
        {
          name: 'LPG',
          value: true
        },
        {
          name: '전기',
          value: true
        },
        {
          name: '하이브리드',
          value: true
        }
      ],
      allRanks: true,
      allFuels: true,

// ...

  methods: {
    selectAllFuels() {
      if (this.allFuels === true) {
        return this.fuels.forEach(element => (element.value = false))
      } else {
        return this.fuels.forEach(element => (element.value = true))
      }
    },
    selectAllRanks() {
      // console.log('allRanks 실행')
      if (this.allRanks === true) {
        return this.ranks.forEach(element => (element.value = false))
      } else {
        return this.ranks.forEach(element => (element.value = true))
      }
    },

// ...

click 이벤트에 selectAllFuels(연료 선택), selectAllRanks(차종 선택) 함수를 걸어 '전체' 체크 value에 따라서 각각 fuels와 ranks 안에 있는 값들이 모두 false / true가 되게 만들었다.

 

결과

전체 체크박스 해제 시 모두 해제됨
전체 체크박스 체크 시 모두 체크됨

'프로젝트 > Digital Twin Bootcamp' 카테고리의 다른 글

[Team 제주 넘는 차] 예약 페이지 유효성/공란 체크  (0) 2022.03.04
[Team 제주 넘는 차] 로그아웃  (0) 2022.03.03
[Team 제주 넘는 차] 회원 가입 / 로그인  (0) 2022.02.22
[Team 제주 넘는 차] 제주도 렌터카 사이트 프로젝트 계획  (0) 2022.02.22
HTML  (0) 2022.01.23
'프로젝트/Digital Twin Bootcamp' 카테고리의 다른 글
  • [Team 제주 넘는 차] 예약 페이지 유효성/공란 체크
  • [Team 제주 넘는 차] 로그아웃
  • [Team 제주 넘는 차] 회원 가입 / 로그인
  • [Team 제주 넘는 차] 제주도 렌터카 사이트 프로젝트 계획
Ail_
Ail_
Ail_
log
Ail_
  • 분류 전체보기 (182)
    • 사설 (11)
      • 강연 (5)
      • * (3)
      • 회고 (3)
    • 공부 (161)
      • Just do it (3)
      • TIL (66)
      • Game Bootcamp (31)
      • Digital Twin Bootcamp (39)
    • 노션 (3)
    • 프로젝트 (23)
      • Game Bootcamp (1)
      • Digital Twin Bootcamp (21)
      • 경기청년 갭이어 (1)

인기 글

최근 글

태그

  • 개발회고
  • 회고
  • SQL첫걸음
  • 유니티 게임 개발
  • 개발일지
  • 부트캠프
  • Chat
  • 유니티
  • TypeScript
  • notion
  • 데이터베이스
  • 템플릿
  • 이펙트
  • mysql 설치
  • 배포
  • 티스토리챌린지
  • 피격
  • 멋쟁이사자처럼
  • 인터랙티브 웹 UX·UI
  • 공격
  • C#
  • 노션
  • 오블완
  • 플레이어
  • node.js
  • 한입 크기로 잘라 먹는 타입스크립트
  • Do it! 자료구조와 함께 배우는 알고리즘 입문 : 파이썬 편
  • SQL 첫걸음
  • unity
  • 대시

최근 댓글

전체
오늘
어제
hELLO · Designed By 정상우.
Ail_
[Team 제주 넘는 차] 체크박스 '전체' 항목 로직
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.