vue.js/vue.js 기능

vue.js - v-model 배열(array)로 데이터 바인딩 하기

한번만만 2021. 1. 20. 00:28
반응형

서론

이번 프로젝트 하면서 가장 짜증났던 요건이 있다.

 

1. select box 데이터를 다중 선택해야 하는 상황일때 multi select box가 아닌 select box를 다중으로 노출.

ex) 3가지의 select 데이터 중 2개를 선택해야 한다면 2개의 select box를 생성하고 각각 1개씩 선택

2. 첫번째 select box에서 데이터를 선택했다면 두번째 select box는 선택 불가.

 

라는 vue.js 하면서 만났던 방식 중 가장 짜증나는 방식이었다.

 

개발

1. select box 데이터를 다중 선택해야 하는 상황일때 multi select box가 아닌 select box를 다중으로 노출.

> 다중 선택해야 하는 개수만큼 select box를 v-for 처리. option 영역은 select 데이터로 v-for 처리.

 

2. 첫번째 select box에서 데이터를 선택했다면 두번째 select box는 선택 불가.

> disabled 를 이용하여 isVisible 메소드를 호출하여 처리.

 

소스

HTML

<template>
  <div class="container">
    <div>
      <Logo />
      <h1 class="title">
        select data 테스트
      </h1>
    </div>
    <select v-for="n in selectCnt" :key="n" v-model="selectExcludes[n-1]" class="select">
      <option value="undefined">
        선택 안함
      </option>
      <option v-for="(item, index) in selectList" :key="index" :disabled="isVisible(item.id)" :value="item.id">
        {{ item.name }}
      </option>
    </select>
    <br><br>
    <input type="button" value="현재 데이터 확인" @click="dataCheck">
    <br><br>
    <input type="button" value="첫번째 select data 111" @click="setFirstData">
  </div>
</template>
  1. 다중 선택해야 하는 selectCnt 수 만큼 select box를 for문 생성
  2. 선택 가능한 selectList 만큼 option을 for문으로 노출
  3. v-model을 이용하여 selectExcludes 의 array에 데이터 바인딩
  4. disabled를 이용하여 이미 선택한 데이터는 선택 불가 처리

SCRIPT

export default {
  data () {
    return {
      selectCnt: 2,
      selectList: [
        {
          id: '111',
          name: 'name111'
        },
        {
          id: '222',
          name: 'name222'
        },
        {
          id: '333',
          name: 'name333'
        }
      ],
      selectExcludes: []
    }
  },
  methods: {
    isVisible (data) {
      let returnFlag = false
      for (const i in this.selectExcludes) {
        if (this.selectExcludes[i] === data) {
          returnFlag = true
        }
      }
      return returnFlag
    },
    dataCheck () {
      console.log(this.selectExcludes)
    },
    setFirstData () {
      this.$set(this.selectExcludes, 0, '111')
    }
  }
}
  1. data에 선택한 데이터를 담을 selectExcludes을 배열로 선언
  2. isVisible 메소드를 이용하여 현재 데이터가 담겨있는 selectExcludes 배열에 option 데이터가 존재한다면 true, 존재 하지 않는다면 false를 return

* 실제 개발에서는 axios로 가져올 데이터지만 테스트를 위해 selectCnt, selectList는 data에 선언

 

테스트

select box에서 선택한 데이터는 선택 불가 처리.

v-model로 데이터 바인딩 확인을 위한 console.log 확인

this.$set 를 이용하여 외부에서 데이터 바인딩 처리 확인

 

결론

v-model을 기본적으로 string으로 넣고 value도 string으로 해서 데이터 바인딩을 하였는데 배열로 처리할수 있다는것을 확인한 공부였다.

반응형