# Event Bus, Life Cycle, ES6
# Component / Instance Option 순서
# 다른 Component로 값을 보내는 법
이벤트 명이 같으면 안 된다.
- event + props
- 일반적으로는 다른 컴포넌트에 값을 보내줄 때, 상위 component에 값을 올린 후에 다시 하위 component로 내려줘야 한다.
- event bus
- src 밑에 utils 폴더 -> bus.js 생성
export var bus = new Vue(); // export : 다른 곳에서 쓰기 위함
import { bus } from '../utils/bus';
- this.$emit('...') : 밑에서 위로 올려보낼 때 사용 (이벤트 트리거)
removeAll: function() {
localStorage.clear();
this.$emit('remove-all'); // event bus -> 컴포넌트간 data 전달 가능
bus.$emit('remove-all');
}
beforeMount: function() {
bus.$on('remove-all'); //이벤트를 받기 위함
}
- 위 방식은 기본 최상위 컴포넌트인 root로 가는 것이 아니라 외부의 root라는 bus를 통해서 data를 전달하는 방식이다.
- 복잡해질수록 나중에 tracking하기가 어렵다. (규칙에 의한 방식이 아니라, 일종의 편법이기 때문)
- 따라서 위 방식을 팀 프로젝트 내에서 쓰려면 코딩 컨벤션을 따라야 한다.
- 대개는 event로 올리고, props로 내리는 방법을 채택하고, 이 계층이 깊어지면 Vuex를 채택한다.
beforeDestroy: function() { // event를 제거할 때
bus.$off('remove-all', this.removeItems)
}
$on으로 event를 생성한 이후에, event queue에 쌓이기 때문에, $off로 제거하는 것이 필요하다.
# Props 작성 방식
vue의 event bus를 사용할 때에 app에서 data를 내려 보내기 위해 props 사용
props: ['list'];
props: {
list: Array;
}
# v-on 이벤트 작성 방식
<todo-footer v-on:clear="todoItems = []"></todo-footer>
이것도 가능하지만, 유지보수를 위해 아래와 같이 method로 작성해주는 것이 좋음
this.todoItems = [];
localStorage.clear();
추가적으로 리스트의 값이 바뀌고 나서 화면이 바로 바뀌는 것을 reactivity라고 말한다.
# 자바스크립트 for문 문법
for (var i = 0; i < arr.length; i++) {
console.log(arr[i]);
}
arr.forEach(function(value, index) {
console.log(value, indexedDB);
});
for (var key in arr) {
console.log(key, arr[key]);
}
- Vue에서는 이렇게 쓴다.
<li v-for="(item, index) in list" :key="index"></li>
key는 unique한 값 (key는 id나 index값을 주로 사용함)
# Event, emit, payload
this.$emit('add:todo', value); // 동작: 대상
payload : 인자
this.$emit('remove-each', item, index); // payload의 순서대로 들어감
# Vue 파일에서 style 적용
<template>
<h1>Todo App</h1>
</template>
<style scoped>
h1 {
color: blue;
}
</style>
style에 scoped 속성 추가하면 그 component의 file에만 적용되는 스타일이 된다.
# Mounted
template이 string에서 tag로 변경되는 시점이다.
export default {
//vcrea
created() { // document 생성 x
var h1 = document.querySelector('h1');
console.log('created', h1);
},
//vbm
beforeMount() { // document 생성 x
var h1 = document.querySelector('h1');
console.log('before mount', h1);
},
//vm
mounted() { // template가 실제 dom에 있지 않고 string 상태에서, mounted가 되어야 tag로 변환된다.
var h1 = document.querySelector('h1');
console.log('mounted', h1);
},
};
</script>
created - beforeMount, Mounted 순서로 뜨는 것을 볼 수 있다.
# form tag
form 태그는 submit 되면 새로고침이 되는 특징이 있다. 이것을 막기 위해서,
event.preventDefault();
혹은
<form v-on:submit.prevent="submitForm"></form>
이런 처리들을 해줘야 한다.
이와 비슷한 event modifiers에는 prevent를 포함해 6가지 종류가 있다
# Babel
최신 JS 문법(ES6 이상)이 여러 브라우저에서 돌아갈 수 있게 해주는 것이 Babel이다.
Babel을 쓰는 이유는 IE 때문임을 알 수 있다.
# 자바스크립트 최신문법 (ES6)
1. destructuring
var { name, id } = data;
2. 변수 선언
let a = 2; // 한 번 선언한 것은 다시 선언 할 수 없다.
const c = 20; // const도 마찬가지
3. for문
JS는 ES6 이전에 var 선언으로 마지막 값에 접근이 가능한 문제가 있었지만,
let을 통해서 해당 문제를 해결하였음.
4. Async, Await
init() {
loginUser()
.then(getTodo)
.then(displayTodo)
.catch()
},
getTodo() {
return new Promise((resolve, reject) => {
resolve();
//return axios.get()
})
}
Promise chaining은 코드가 복잡해지기 때문에 async, await를 쓰는 것이 최근 권장된다.
async function 함수명() {
await 비동기_처리_메서드_명();
}
일반적으로 await의 대상이 되는 비동기 처리 코드는 axios 등 프로미스를 반환하는 API 호출 함수.
async loginUser(){
const user = await getUser();
const todo = await getTodo(user.id);
this.todo = todo;
}
기본적으로 js는 코드가 위에서 아래로 실행되는데, async, await를 사용하지 않으면 위의 코드가 완료되기 전에 뒤에 코드가 실행되지 않을 것이다.
async & await에서 예외처리 하는 방법은 try catch이다. 프로미스에서 .catch()를 사용했던 것처럼 async에서는 catch {}를 사용하면 된다.
# 화살표 함수
arr.forEach((value, index) => {
console.log(value, index);
});
만약에 인자가 하나라면 괄호를 없애도 된다.
var sum = (a, b) => {
return a + b;
};
var vm = this;
return axios.get('https://jsonplaceholder.typicode.com/posts/1').then(data => {
this.post = data.post; // 화살표 함수를 쓰면 vm이 아닌 this를 사용해도 된다.
});
인스턴스 option 속성에는 화살표를 쓰면 안된다. 바로 위의 this 범위가 달라지기 때문.
fetchItems() {
…
}
대신에 이런 식으로 작성이 가능하다.
# Enhanced Object Literal
향상된 객체 리터럴(표기법) : key와 value가 같아질 때 사용한다.
var obj = {
num, // num: num,
};
vue의 component 정의에서도 예를 들어 TodoInput이 html에서는 todo-input으로 바뀌기 때문에 사용 가능하다. (대소문자 구별을 하지 않기 때문이다)
# import, export
- 값이나 변수가 나가는 곳에서 export var a
- 다른 파일에서 값을 받아오기 위할 때 사용
- 받는 곳에서 import {값 or 함수} from '가져오는 위치'
- export default
- 해당 파일에서 무조건 하나만 들고 오겠다면 default를 붙인다.
- 이때는 무조건 하나만 들고 오기 때문에, import sum from '...' 처럼 { } 없이 들고 올 수 있다.