2020/03/25
npm install -g @vue/cli
vue create 폴더명
vue create 폴더명
명령어를 실행하면 아래 스크린샷 처럼 나오게 된다.
defalut
는 기본적으로 설정되어 있는데로 설치하겠다는 것.
Manually select features
는 직접 선택할 수 있다.
TypeScript, Vuex, Router 등 여러가지를 선택할 수 있다. 일단 저 상태 그대로 진행하도록 한다.
ESlint와 Prettier를 선택한다.
package.json파일에 위치할 필요가 없기때문에 그대로 진행하면 된다.
이 설정을 저장할 것이냐고 묻는 것인데 yes or no 선택하면된다
먼저 최상위에 .eslintrc.js
파일 만들고 아래의 코드를 작성한다.
module.exports = {
root: true,
env: {
node: true,
},
extends: ['plugin:vue/essential', 'eslint:recommended', '@vue/prettier'],
parserOptions: {
parser: 'babel-eslint',
},
rules: {
'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
},
};
어딜가도 빠지지 않는 TodoList를 만들면서 실습해보려고 한다.
오늘 만드는 TodoList는 모바일 view를 기준으로 만들었다. 완성된 모습은 아래의 이미지와 같다.
먼저 최상위 컴포넌트는 App component
.
그 안에 TodoHeader, TodoInput, TodoList, TodoFooter 4개의 자식컴포넌트가 있다.
<template>
<div>
<TodoHeader />
<TodoInput v-on:addTodo="addTodo" />
<TodoList v-bind:propsData="todoItems" v-on:removeTodo="removeTodo" />
<TodoFooter v-on:removeAll="clearAll" />
</div>
</template>
($emit으로 addTodo가 왔을 경우 addTodo함수 실행)
($emit으로 removeTodo가 왔을 경우 removeTodo함수 실행)
($emit으로 removeAll이 왔을 경우 removeAll함수 실행)
<script>
// 컴포넌트들을 import한다.
import TodoHeader from "./components/TodoHeader";
import TodoInput from "./components/TodoInput";
import TodoList from "./components/TodoList";
import TodoFooter from "./components/TodoFooter";
export default {
data() {
return {
todoItems: []
};
},
methods: {
addTodo(data) {
localStorage.setItem(data, data);
this.todoItems.push(data);
},
clearAll() {
localStorage.clear();
this.todoItems = [];
},
removeTodo(data, index) {
localStorage.removeItem(data);
this.todoItems.splice(index, 1);
}
},
created() {
if (localStorage.length > 0) {
for (let i = 0; i < localStorage.length; i++) {
this.todoItems.push(localStorage.key(i));
console.log(localStorage.key(i));
}
}
},
components: {
TodoHeader,
TodoInput,
TodoList,
TodoFooter
}
};
</script>
<template>
<div class="inputBox shadow">
<input
type="text"
v-model="newTodoItem"
v-on:keyup.enter="addTodo"
placeholder="what do you have to do?"
/>
<button v-on:click="addTodo">추가</button>
</div>
</template>
<script>
export default {
data() {
return {
newTodoItem: ""
};
},
methods: {
addTodo() {
if (this.newTodoItem !== "") {
let value = this.newTodoItem && this.newTodoItem.trim();
this.$emit("addTodo", value);
this.clearInput();
} else {
alert("내용을 입력하세요");
}
},
clearInput() {
this.newTodoItem = "";
}
}
};
</script>
this.newTodoItem = '';
라고 직접 작성할 수 도 있지만 그렇게 하지 않은 이유는 단일 책임 원칙(Single Responsibility Principle)
때문이다.단일 책임 원칙이란, 하나의 함수는 하나의 기능만을 담당하도록 설계하는 객체 지향 프로그래밍의 디자인 패턴이다.
<template>
<section>
<transition-group name="list" tag="ul">
<li v-for="(item, index) in propsData" v-bind:key="item">
{{ item }}
<span class="btn" type="button" @click="removeTodo(item, index)"
>삭제</span
>
</li>
</transition-group>
</section>
</template>
v-for
디렉티브를 이용하여 데이터를 렌더링 한다.
v-for를 사용할 때에는 key는 필수로 bind 해주어야한다.
(item, index) in propsData
props로 받아온 propsData가 원본 data이다.<script>
export default {
props: ["propsData"],
methods: {
removeTodo(item, index) {
this.$emit("removeTodo", item, index);
}
}
};
</script>
<template>
<div>
<span class="allBtn" v-on:click="clearTodos">Clear ALL</span>
</div>
</template>
<script>
export default {
methods: {
clearTodos() {
this.$emit("removeAll");
}
}
};
</script>
vue 애니메이션은 vue 프레임워크 자체에서 지원하는 애니메이션 기능이다.
데이터 추가, 변경, 삭제에 대해서 페이드인, 페이드 아웃 등의 여러 가지 에니메이션 효과를 지원한다.
간단한 데이터부터 목록 아이템까지 모두 지원할 뿐만 아니라, 기타 자바스크립트 애니메이션 라이브러리나 CSS애니메이션 라이브러리도 함께 사용할 수 있다.
자세한 내용은 vue animation 공식 문서를 참고.