์ด๋ฒคํธ ๋ช ์ด ๊ฐ์ผ๋ฉด ์ ๋๋ค.
- 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๋ก ์ ๊ฑฐํ๋ ๊ฒ์ด ํ์ํ๋ค.
vue์ event bus๋ฅผ ์ฌ์ฉํ ๋์ app์์ data๋ฅผ ๋ด๋ ค ๋ณด๋ด๊ธฐ ์ํด props ์ฌ์ฉ
props: ['list'];
props: {
list: Array;
}
<todo-footer v-on:clear="todoItems = []"></todo-footer>
์ด๊ฒ๋ ๊ฐ๋ฅํ์ง๋ง, ์ ์ง๋ณด์๋ฅผ ์ํด ์๋์ ๊ฐ์ด method๋ก ์์ฑํด์ฃผ๋ ๊ฒ์ด ์ข์
this.todoItems = [];
localStorage.clear();
Vue.js Event Bus์ ๋ํด ์ ์ ๋ฆฌ๋ ๊ธ
์ถ๊ฐ์ ์ผ๋ก ๋ฆฌ์คํธ์ ๊ฐ์ด ๋ฐ๋๊ณ ๋์ ํ๋ฉด์ด ๋ฐ๋ก ๋ฐ๋๋ ๊ฒ์ reactivity๋ผ๊ณ ๋งํ๋ค.
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๊ฐ์ ์ฃผ๋ก ์ฌ์ฉํจ)
this.$emit('add:todo', value); // ๋์: ๋์
payload : ์ธ์
this.$emit('remove-each', item, index); // payload์ ์์๋๋ก ๋ค์ด๊ฐ
<template>
<h1>Todo App</h1>
</template>
<style scoped>
h1 {
color: blue;
}
</style>
style์ scoped ์์ฑ ์ถ๊ฐํ๋ฉด ๊ทธ component์ file์๋ง ์ ์ฉ๋๋ ์คํ์ผ์ด ๋๋ค.
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 ํ๊ทธ๋ submit ๋๋ฉด ์๋ก๊ณ ์นจ์ด ๋๋ ํน์ง์ด ์๋ค. ์ด๊ฒ์ ๋ง๊ธฐ ์ํด์,
event.preventDefault();
ํน์
<form v-on:submit.prevent="submitForm"></form>
์ด๋ฐ ์ฒ๋ฆฌ๋ค์ ํด์ค์ผ ํ๋ค.
์ด์ ๋น์ทํ event modifiers์๋ prevent๋ฅผ ํฌํจํด 6๊ฐ์ง ์ข ๋ฅ๊ฐ ์๋ค
์ต์ JS ๋ฌธ๋ฒ(ES6 ์ด์)์ด ์ฌ๋ฌ ๋ธ๋ผ์ฐ์ ์์ ๋์๊ฐ ์ ์๊ฒ ํด์ฃผ๋ ๊ฒ์ด Babel์ด๋ค.
Babel์ ์ฐ๋ ์ด์ ๋ IE ๋๋ฌธ์์ ์ ์ ์๋ค.
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() {
โฆ
}
๋์ ์ ์ด๋ฐ ์์ผ๋ก ์์ฑ์ด ๊ฐ๋ฅํ๋ค.
ํฅ์๋ ๊ฐ์ฒด ๋ฆฌํฐ๋ด(ํ๊ธฐ๋ฒ) : key์ value๊ฐ ๊ฐ์์ง ๋ ์ฌ์ฉํ๋ค.
var obj = {
num, // num: num,
};
vue์ component ์ ์์์๋ ์๋ฅผ ๋ค์ด TodoInput์ด html์์๋ todo-input์ผ๋ก ๋ฐ๋๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค. (๋์๋ฌธ์ ๊ตฌ๋ณ์ ํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค)
- ๊ฐ์ด๋ ๋ณ์๊ฐ ๋๊ฐ๋ ๊ณณ์์ export var a
- ๋ค๋ฅธ ํ์ผ์์ ๊ฐ์ ๋ฐ์์ค๊ธฐ ์ํ ๋ ์ฌ์ฉ
- ๋ฐ๋ ๊ณณ์์ import {๊ฐ or ํจ์} from '๊ฐ์ ธ์ค๋ ์์น'
- export default
- ํด๋น ํ์ผ์์ ๋ฌด์กฐ๊ฑด ํ๋๋ง ๋ค๊ณ ์ค๊ฒ ๋ค๋ฉด default๋ฅผ ๋ถ์ธ๋ค.
- ์ด๋๋ ๋ฌด์กฐ๊ฑด ํ๋๋ง ๋ค๊ณ ์ค๊ธฐ ๋๋ฌธ์, import sum from '...' ์ฒ๋ผ { } ์์ด ๋ค๊ณ ์ฌ ์ ์๋ค.