Vue.js

컴포넌트 구성

Jungsoomin :) 2020. 12. 16. 18:11
  • v-model 은 동적으로 입력값을 받아 Vue Instance 에 매핑시키는 역할을 한다.
  • v-on:이벤트 = 작동 메서드 |  일어나는 이벤트를 감지하여 Vue Instance 의 methods 속성에 기재한 로직을 실행한다.
  • 하위 컴포넌트의 This 는 거슬러 올라가 Root Component 까지 간다. 추측하기에 ES6 의 Arrow Function 은 바인딩이 컴포넌트 안에서 머무는 듯 하다. 바인딩이 안된다. 어디까지나 추측이다.
<template>
  <div class="inputBox shadow">
    <input type="text" v-model="newTodoItem" v-on:keyup.enter="addTodo">
    <!-- v-on:이벤트 = 실행메서드 -->
    <span class="addContainer" v-on:click="addTodo">
      <i class="fas fa-plus addBtn"></i>
    </span>
  </div>
</template>

<script>
export default {
  //Arrow Function
  data: () => {
    return {
      newTodoItem: ""
    }
  },
  methods: {
    // 화살표 함수 쓰면 바인딩 잘못 됨
    addTodo: function() {
      console.log(this.newTodoItem);
      localStorage.setItem(this.newTodoItem,this.newTodoItem);
      this.clearInput();
    },
    clearInput: function () {
      // 단일 책임 원칙
      this.newTodoItem = '';
    }
  }
}
</script>

<style scoped>
input:focus {
    outline: none;
  }
.inputBox {
    background-color: white;
    height: 50px;
    line-height: 50px;
    border-radius: 5px;
  }
.inputBox input {
    border-style: none;
    font-size: 0.9rem;
  }
.addContainer {
    float: right;
    background: linear-gradient(to right, #6478FB, #8763FB);
    display: block;
    width: 3rem;
    border-radius: 0 5px 5px 0;
  }
.addBtn {
    color: white;
    vertical-align: middle;
  }
</style>

  • v-for for-in 문으로 순회를 돌린다. v-bind:key 로 key 를 지정하여 순회속도를 가속화시킨다.
  • Object.entries() 는 Object 를 Map 으로 변환시키며 순회 메서드를 사용하게 해준다.
<template>
  <ul>
    <li v-bind:key="index" v-for="(todoItem, index) in todoItems" class="shadow">
      {{todoItem}}
      <span class="removeBtn" v-on:click="removeTodo(todoItem,index)">
        <i class="fas fa-trash"></i>
      </span>
    </li>
  </ul>
</template>

<script>
export default {
  data: () => {
    return {
      todoItems: []
    }
  },
  methods: {
    removeTodo: function (todoItem,index) {
      //Template String
      console.log(`${todoItem} / ${index}`);
    }
  },
  created: function () {
    //ES6
   const map = Object.entries(localStorage);
   map.forEach((entry,index) => this.todoItems.push(entry[1]));
  }
}
</script>

<style>
ul {
  list-style-type: none;
  padding-left: 0px;
  margin-top: 0px;
  text-align: left;
}
li {
  display: flex;
  min-height: 50px;
  height: 50px;
  line-height: 50px;
  margin: 0.5rem 0;
  padding: 0 0.9rem;
  background: white;
  border-radius: 5px;
}
.checkBtn {
  line-height: 45px;
  color: #62acde;
  margin-right: 5px;
}
.checkBtnCompleted {
  color: #b3adad;
}
.textCompleted {
  text-decoration: line-through;
  color: #b3adad;
}
.removeBtn {
  margin-left: auto;
  color: #de4343;
}
</style>

  • 객체를 저장시킬때 Object 그대로 저장될수 있다.
  • 그러므로 JSON.springify() 를 사용하여 json 형태로 저장하는 것이 좋다.
  • 가져올때는 JSON.parse() 를 이용하되 맵핑되는 정보를 잘 판단해서 조작한다.
<script>
export default {
  //Arrow Function
  data: () => {
    return {
      newTodoItem: ""
    }
  },
  methods: {
    // 화살표 함수 쓰면 바인딩 잘못 됨
    addTodo: function() {
      if(this.newTodoItem !== '') {
        const obj = {completed: false, item: this.newTodoItem};
      //Object를 저장하기위해 stringify를 사용하는 것도 좋다.
      localStorage.setItem(this.newTodoItem,JSON.stringify(obj));
      this.clearInput();
      }
    },
    clearInput: function () {
      // 단일 책임 원칙
      this.newTodoItem = '';
    }
  }
}
</script>

// 이렇게 가져옴
created: function () {
    //ES6
   const map = Object.entries(localStorage);
   map.forEach((entry,index) => { 
     if(entry[0] !== 'loglevel:webpack-dev-server'){
     const item = JSON.parse(entry[1]);
     console.log(item);
     this.todoItems.push(item.item);
     }
     return ''});
  }

독립된 컴포넌트 간에 통신이 안되어있기 때문에 새로고침 해야 적용된다.


  • v-bind 로 속성을 동적으로 변경할 수 있으며 boolean 값에 따라 적용하지 않거나 할 수 있다.
                    #todoItem.completed 가 true 라면 textCompleted 를 활성화 한다.
<span v-bind:class="{textCompleted: todoItem.completed}">{{todoItem.item}}</span>

 

'Vue.js' 카테고리의 다른 글

2.Vue Instance 와 속성, 라이프 사이클  (0) 2020.12.17
1.Vue.js 기본  (0) 2020.12.17
파비콘, 아이콘, 폰트, 반응형 태그 설정  (0) 2020.12.16
싱글 파일 컴포넌트 구성.  (0) 2020.12.16
Vue Cli 프로젝트 생성  (0) 2020.12.16