ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Vue 003 데이터 바인딩 002
    Vue/Vue 2023 2023. 1. 31. 03:22
    728x90

    vue가 가진 가장 큰 장점중 하나인 양방향 데이터 바인딩을 합시다

    양방향 데이터 바인딩

    DataBindingInputView.vue

    <template>
      <div>
        <input type="text"> 
      </div>
    </template>

    vue에서는 name="" id=""를 쓸 일이 없다.

    • v-model 을 사용해 데이터값을 받아온다
    <template>
      <div>
        <input type="text" v-model="userId" />
      </div>
    </template>
    <script>
    export default {
      components: {}, 
      data() {
        return {
          userId: 'SLOTH'
        }
      },
      .
      .
      .
    • 라우터 등록
      ...
      {
        path: '/databinding/input',
        name: 'DataBindingInputView',
        component: () => import(/* webpackChunkName: "databinding", webpackPrefetch:true */ '../views/1_databinding/DataBindingInputView.vue')
      }
      ...

    나옵니다

    v-model

    양방향 데이터 바인딩이 가능하다 

    사용자가 화면상에서 바꾸게 되면 그 값이 서버에도 바뀌게 된다.

    • 값이 바뀌는지 확인하기 위해 간단하게 버튼을 만들어 확인해보자
    <template>
      <div>
        <input type="text" v-model="userId" />
        <button @click="myFunction">클릭</button>
      </div>
    </template>
    <script>
    .
    .
    .
      methods: {
        myFunction() {
          console.log(this.userId) 
    //this키워드를 사용해서 object안의 특정 키값을 불러오기
    .
    .
    .

    결과

    내가 넣은 값이 콘솔에 출력된다.

    • js에서 변경한 값을 출력하기
    ...
    <button @click="changeData">변경</button>
      </div>
    </template>
    <script>
    ...
        changeData() {
          this.userId = 'Yuki'
        }
    ...

    바뀜

    • 숫자를 주고 받아보자 (.number의 활용)
    <template>
      <div>
       ...
        <!-- string으로 더해져서 num1값과 num2값이 옆으로 붙은 값이 나온다 ex num1='1'+num2='2' result:12 -->
        <input type="text" v-model="num1" />+
        <input type="text" v-model="num2" />=
        <span>{{num1+num2}}</span>
        <br>
        <!-- v-model.number를 사용해 string값을 number로 바꿔준다. 산술연산이 된다. -->
        <input type="text" v-model.number="num3" />+ 
        <input type="text" v-model.number="num4" />=
        <span>{{num3+num4}}</span>
      </div>
    </template>
    <script>
    export default {
      components: {},
      data() {
        return {
          ...
          num1: 0,
          num2: 0,
          num3: 0,
          num4: 0
        }
      },
      ...
      </script>

    결과

    • select box
      • 사용자가 입력하는 개념이 아닌 옵션에 있는 아이템을 선택해 밸류값을 변경시킬 수 있다.
      • 밸류값을 변경시킬 수 있으니 v-model을 이용
    • DataBindingSelectView.vue
    <template>
      <div>
        <select name="" id="" v-model="selectdCity">
          <option value="">선택</option>
          <option value="02">서울</option>
          <option value="031">경기</option>
          <option value="051">부산</option>
        </select>
      </div>
    </template>
    <script>
    export default {
      components: {},
      data() {
        return {
          selectdCity: '02' //서울을 기본값으로
        }
      },
      ...

    결과

    선택 값을 변경시 다른 지역이 나옴

    • Checkbox
      • label과 연결을 위해서 id를 사용한다.
      • 똑같은 그룹으로 묶기위해서 name을 사용할 필요가 없다. v-model과 배열을 사용하면된다.
    • DataBindingCheckboxview.vue
    <template>
      <div>
        <div>
          <input type="checkbox" id="html" value="HTML" v-model="favoriteLang">
          <label for="html">HTML</label>
        </div>
        <div>
          <input type="checkbox" id="css" value="CSS" v-model="favoriteLang">
          <label for="css">CSS</label>
        </div>
        <div>
          <input type="checkbox" id="js" value="JS" v-model="favoriteLang">
          <label for="js">JavaScript</label>
        </div>
        <div>선택한 언어:{{favoriteLang}}</div>
      </div>
    </template>
    <script>
    export default {
      components: {},
      data() {
        return {
          favoriteLang: []
        }
      },
      ...

    결과

    v-model 배열로 지정해줘서 묶인다.

    checkbox의 경우 value값과 양방향 데이터 바인딩이 되는 것이 아니고 checked라는 속성을 바인딩 하는 것

    • RadioButton
      • 체크박스와 비슷하지만 여러개 선택 불가능
      • 데이터를 배열로 선언하면 안되고 문자열로 선언해야함
    • DataBindingRadioView.vue
    <template>
      <div>
        <div>
          <input type="radio" id="html" value="HTML" v-model="favoriteLang">
          <label for="html">HTML</label>
        </div>
        <div>
          <input type="radio" id="css" value="CSS" v-model="favoriteLang">
          <label for="css">CSS</label>
        </div>
        <div>
          <input type="radio" id="js" value="JS" v-model="favoriteLang">
          <label for="js">JavaScript</label>
        </div>
        <div>선택한 언어:{{favoriteLang}}</div>
      </div>
    </template>
    <script>
    export default {
      components: {},
      data() {
        return {
          favoriteLang: ''
        }
      },
      ...

    결과

    • 속성 바인딩
      • readonly의 경우에는 사용자가 값을 바꾸지 못하게 한 것이기 때문에 v-model 할 필요가 없다.
      • v-bind를 사용해 밸류값을 직접 데이터 바인딩을 해준다
      • v-bind는 : 로 대체가 가능하다
    • DataBindingAttributeView.vue
    <template>
      <div>
        <!-- v-bind를 사용해 요소를 직접 바인딩 -->
        <input type="text" v-bind:value="userId" readonly/>
        <!-- v-bind 생략 -->
        <input type="text" :value="userId" readonly/>
        <br>
        <!-- :src 로 요소를 직접 바인딩 -->
        <img :src="imgSrc" alt="" style="width:300px; height:auto;">
        <br>
        <!-- 어떤 값이라도 무조건 들어와야 하는 searchbar -->
        <input type="search" v-model="txt1" />
        <!-- searchbar에 입력이 안되어 있으면 버튼 비활성화  txt1이 비어있냐?-->
        <button :disabled="txt1 === ''">조회</button>
      </div>
    </template>
    <script>
    export default {
      components: {},
      data() {
        return {
          userId: 'Sloth',
          imgSrc: 'https://ichef.bbci.co.uk/images/ic/1008xn/p07rdf0q.jpg',
          txt1: ''
        }
      },
      ...

    비어있다면 버튼 불가능
    입력이 되어있다면 가능!

    • list 바인딩
      • 받아오게 될 데이터로 바인딩해서 갯수만큼 뿌려주기 v-for
    • DataBindingListView.vue
    <template>
      <div>
        <div>
          <select name="" id="">
            <!--
              옵션이 cities의 갯수만큼 존재해야 한다. v-for를 사용한다.
              for in 사용하는 것 처럼 city in cities로 사용하는데
              cities의 데이터에서 뽑아온 각각의 오브젝트데이터가 city로 저장되는 것
              유니크한 key를 무조건 잡아주어야 한다. 여기서는 code가 유일한 키값이 된다. city의 code
              보여주는 화면에는 city의 title을 보여준다.
            -->
            <option value="" :key="city.code" v-for="city in cities">{{city.title}}</option>
          </select>
        </div>
      </div>
    </template>
    <script>
    export default {
      components: {},
      data() {
        return {
          cities: [
            { title: '서울', code: '02' },
            { title: '경기', code: '031' },
            { title: '부산', code: '051' }
          ]
        }
      },
      ...

    결과

    • v-for 사용해 테이블 표 구성하기
    <template>
      <div>
    ...
        <div>
          <table>
            <thead>
              <tr>
                <th>제품번호</th>
                <th>제품명</th>
                <th>가격</th>
                <th>주문수량</th>
                <th>합계</th>
              </tr>
            </thead>
            <tbody>
              <tr :key="drink.drinkId" v-for="drink in drinkList">
                <td>{{drink.drinkId}}</td>
                <td>{{drink.drinkName}}</td>
                <td>{{drink.price}}</td>
                <td><input type="number" v-model="drink.qty"></td>
                <td>{{drink.price * drink.qty}}</td>
              </tr>
            </tbody>
          </table>
        </div>
      </div>
    </template>
    <script>
    export default {
      components: {},
      data() {
        return {
    ...
          drinkList: [
            { drinkId: '1', drinkName: '코카콜라', price: 700, qty: 1 },
            { drinkId: '2', drinkName: '오렌지주스', price: 1200, qty: 1 },
            { drinkId: '3', drinkName: '커피', price: 500, qty: 1 },
            { drinkId: '4', drinkName: '물', price: 700, qty: 1 },
            { drinkId: '5', drinkName: '보리차', price: 1200, qty: 1 },
            { drinkId: '6', drinkName: '포카리', price: 1000, qty: 1 },
            { drinkId: '7', drinkName: '뽀로로', price: 1300, qty: 1 }
          ]
        }
      },
    ...

    key값으로 쓸만한 요소가 없다면 i를 선언해 index를 주면 된다.

    꽤 빠르네

    • class 바인딩
    •  
    <template>
      <div>
        <!--
          클래스에 오브젝트를 선언해서 넣을 수 있다. 변수를 설정해 동적으로 만들 수 있다.
          키는 클래스 이름, 값은 불리언
          클래스 명이 한단어로 되어있으면 따옴표 안붙여도 됨
        -->
        <div :class="{ 'text_navy':hasError, 'active':isActive }">클래스 바인딩</div>
        <!-- 배열로도 가능 -->
        <div :class="class2">클래스 바인딩2</div>
      </div>
    </template>
    <script>
    export default {
      components: {},
      data() {
        return {
          isActive: false,
          hasError: false,
          class2: ['active', 'hadError']
        }
      },
    ...
    </script>
    <style scoped>
      .active{
        font-weight: bolder;
        border: 1px solid black;
      }
      .text_navy{
        background-color: yellow;
        color: navy;
      }
    </style>

    결과

     

    • 스타일 바인딩
      • 오브젝트 형식으로 지정해 줄 수 있다.
    <template>
      <div>
        <!-- 마치 오브젝트 키:밸류 를 보는 것 같다. -->
        <div style="color:red;font-size:30px">스타일 바인딩: 글씨는 red, 폰트크기:30px</div>
        <!-- 그럼 오브젝트로 적용하자! -->
        <div :style="style1"> 스타일 바인딩: 글씨는 green, 폰트크기:30px</div>
        <button @click="style1.color='blue'">색상 바꾸기</button>
      </div>
    </template>
    <script>
    export default {
      components: {},
      data() {
        return {
          style1: {
            color: 'green',
            fontSize: '30px' // 카멜케이스를 써야한다.
          }
        }
      },
    ...
    </script>
    <style scoped>
    
    </style>

    결과

    버튼을 누르면 바뀐다.

     

     

    state는 집에가 엄마는 vue 할거야

     

    728x90

    'Vue > Vue 2023' 카테고리의 다른 글

    Vue 2-2 props와 웹팩의 필요성  (0) 2023.02.06
    Vue 004 이벤트001 -클릭, 체인지, 키  (0) 2023.02.01
    Vue 003 데이터 바인딩 001  (1) 2023.01.30
    Vue 002 라우터  (1) 2023.01.28
    Vue 001 설치  (0) 2023.01.27
designitlikesloth