Vue ๊ณผ์ ์ ์์ฒญ๋ Vue ๊ฐ์๋์ด ๊ฒน์น๋ฉด์ TIL์ ๊ณ ์ํ๊ณ WIL๋ ์ด์ ์์ผ ์์ฑํ๊ฒ ๋์๋ค.
๊ทธ๋๋ ์ฐฉ์คํ ๊ฐ์๋ฅผ ๋ค์ ๊ฒฐ๊ณผ Vue ๊ณผ์ ๋ฅผ ๋๋ฆ ๊ด์ฐฎ๊ฒ ๊ตฌํํ ๊ฒ ๊ฐ๋ค. ์์ง๊น์ง ๊ฐ์ ํด์ผํ ์ ์ด ๋ง์ง๋ง ๊ธฐ๋ณธ ์๊ตฌ์ฌํญ ๋ฐ ์ ํ ์๊ตฌ์ฌํญ์ ๋ชจ๋ ๊ตฌํํ๊ธฐ์ ์ถํ์ ๋ ๋ฆฌํฉํ ๋งํ ๊ฒ์ด๋ค.
์ด๋ฒ์ฃผ๋ถํฐ๋ ๋ง๋ ๋ง๊ณ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ ๋์ธ์ธ React์ ๋ง์ฃผํ๋ค.
์ด์ ์ ์ฐ๋จน์ผ๋ก ๋ฐฐ์ ๋ React๋ ์์ ๋๋ ๋์ง๋ง ์ด๋ ค์ ๋ ๊ธฐ์ต์ด ์์ด ๋ฐ๋ธ์ฝ์ค์์๋ ๊ธฐ์ด๋ถํฐ ์ฐจ๊ทผ์ฐจ๊ทผ ๋ค์ ธ๋๊ฐ ๊ณํ์ด๋ค! ์์!
Vue์ ์ํ๊ด๋ฆฌ ํจํด Vuex
Vuex ๋ชจ๋ํ
Not Found page path ์ค์
๋ค๋น๊ฒ์ด์ ๊ฐ๋์ ๋ฉํ ํ๋๋ฅผ ํตํ ์ ๊ทผ ์ ํ
๋ค๋ฅธ ํ์ด์ง๋ก ์ด๋ ์ ์คํฌ๋กค ๋ฆฌ์ ํ๊ธฐ
Composition API
reactive ํจ์
pinia vs vuex
HTML ๋ณ์์ ์ฅ์
HTMLInputElement ๋จ์ธ ํ์์ฑ
๋ ธ์ ํด๋ก ๊ณผ Todo List ํ์ด์ง ์ค์ต
React์๋ ์ํ๊ด๋ฆฌ๋ฅผ ์ํด redux, recoil์ด ์๋ฏ์ด ์ผ๋ง ์ ๊น์ง๋ Vuex๋ฅผ ์ํ ๊ด๋ฆฌ ํจํด์ผ๋ก ์ฌ์ฉํ๋ค.
npm i vuex@next
๋ช
๋ น์ด๋ฅผ ํตํด ํจํค์น๋ฅผ ์ค์นํ ํ ์๋์ ๊ฐ์ด importํ createStore
๊ฐ์ฒด๋ฅผ ํตํด ์ฌ์ฉํ ์ ์๋ค.๋ณดํต์ index.js
๋ผ๋ ๋
๋ฆฝ๋ ํ์ผ๋ก ์ํ๋ฅผ ๊ด๋ฆฌํ๋ค.
// index.js
import { createStore } from 'vuex'
export default createStore({
// ์ปจ์
์์ฑ ...
})
๋๋ต์ ์ผ๋ก ํฌ๊ฒ 4๊ฐ์ง ์ปจ์
์ผ๋ก ๋๋์ด์ ธ ์๋ค.
๊ฐ๊ฐ์ ์ปจ์
์ ์ญํ ์ด ๋ค๋ฅด๋ฉฐ ์๋ก์ ์ญํ ์ ์นจ๋ฒํ๊ฒ ๊ตฌํํ๋ฉด ์๋๋ค.
์๋ก์ ์ญํ ์ ์นจ๋ฒํ๊ฒ ๋๋ฉด ์ํ ๊ด๋ฆฌ๋ฅผ ํ๋ ์๋ฏธ๊ฐ ์ฌ๋ผ์ง๋ค.
๋์ค์ ๊ด๋ จ ์ด์๊ฐ ๋ฐ์ํ์ ๊ฒฝ์ฐ ์ถ์ ์ด ํ๋ค๊ธฐ ๋๋ฌธ์ ๊ฐ์์ ๊ธฐ๋ฅ์ ๋ง๊ฒ ๊ตฌํํํ๋ ๊ฒ์ด ์ ์ผ ์ค์ํ๋ค.
State
๊ธฐ๋ณธ์ ์ธ ์ํ์ ๊ด๋ จ๋ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๋ค.
๊ธฐ์กดdata()
์ ๊ฐ์ด ๋ฐํ๊ฐ์ด ์๋ ํจ์ ํํ๋ก ๊ตฌํํด์ผ ํ๋ค.
์ ๊ทผํ ๋๋ computed
์์ฑ๊ณผ ํจ๊ป $store.state
๋ก ๊ฐ๋ฅํ๋ค.
Getters
state
๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ณ์ฐ๋ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๋ค. state
๊ฐ ๋ฐ๋๋ฉด getters
์ ์ ์๋ ๋ฉ์๋๋ก ๋ฐ๋ ๊ณ์ฐ๊ฐ์ ์ ๊ณตํ๋ค.
getters
๋ด ๋ฉ์๋ ์ฒซ ๋ฒ์งธ ์ธ์๋ก state
๋ฅผ ๋ฐ์ ์ ์๋ค.
์ ๊ทผํ ๋๋ $store.getters
๋ก ๊ฐ๋ฅํ๋ค.
Mutations
ํ๊ธ๋ก ๋ณ์ด๋ผ๋ ๋ป์ด๋ค. ์ง๊ด์ ์ผ๋ก state
๊ฐ ๋๊ธฐ์ ์ผ๋ก ๋ณํ(๋ณ์ด)์ํค๋ ๋ฉ์ค๋๋ฅผ ํฌํจํ๋ค.
mutations
๋ด ๋ฉ์๋ ์ฒซ ๋ฒ์งธ ์ธ์๋ก state
๋ฅผ ๋ฐ์ ์ ์๋ค.
mutations
๋ด ๋ฉ์๋๋ฅผ ์คํํ ๋๋ $store.commit("๋ฉ์๋๋ช
")
์ผ๋ก ๊ฐ๋ฅํ๋ค.
Actions
Mutations์์๋ ๋๊ธฐ์ ์ผ๋ก ์ํ ๋ฐ์ดํฐ ๋ณํ์ ๋ํด์ ๊ด๋ฆฌํ๋ค๋ฉด actions์์๋ ๋ณดํต ๋น๋๊ธฐ์ ์ผ๋ก ์ํ ๋ฐ์ดํฐ๊ฐ ๋ณํํ๋ ๊ฒ์ ๊ด๋ฆฌํ๋ค. ์๋ฅผ ๋ค์ด Async await.
actions
๋ด ๋ฉ์๋์ ๋งค๊ฐ๋ณ์๋ก๋ context
๊ฐ์ฒด๊ฐ ์ฃผ์ด์ง๋ค.
์ด ๊ฐ์ฒด๋ state
, getters
, commit
, dispatch
์ ์์ฑ์ ๊ฐ์ง๋ฏ๋ก ์ด๋ค ๊ธฐ๋ฅ์ ์ฌ์ฉํ ๊ฒ์ธ์ง ๋ฐ๋ผ ์ ํํ๋ฉด ๋๋ค.
Actions ๋ด ๋ฉ์๋๋ฅผ ์คํํ ๋๋ $store.dispatch("๋ฉ์๋๋ช
")
์ผ๋ก ๊ฐ๋ฅํ๋ค.
์ต๊ทผ Vue3 ๋ฒ์ ์์๋ ์๋ก์ด Pinia๊ฐ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ฌ์ฉ๋๊ณ ์์ง๋ง ๊ธฐ์กด์ ๋๋ฆฌ ์ฌ์ฉ๋์๋ Vuex์ ๋ํ ์ดํด๊ฐ ๋จผ์ ์ ํ๋์ด์ผ ํ๊ธฐ์ ๊ผญ ์์งํ๊ณ ๋์ด๊ฐ์ผ๊ฒ ๋ค.
์ํ ๋ฐ์ดํฐ์ ๊ธฐ๋ฅ์ด๋ ๋ชฉ์ ์ ๋ฐ๋ผ ๋ชจ๋ํ๊ฐ ๊ฐ๋ฅํ๋ค.
๊ฐ์์์๋ ๋ธ๋ผ์ฐ์ ์ ๋ํ๋ด๋ ๋ฉ์์ง์ ์ํ์ ์นด์ดํธ ์ซ์๋ฅผ ๊ด๋ฆฌํ๋ Vuex ๋ชจ๋์ ๋ถ๋ฆฌํ์๋ค.
๊ทธ ์ค ๋ฉ์์ง ๋ฐ์ดํฐ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒ์ ๋ฏ์ด๋ณด์.
๋ชจ๋์ createStore
๊ฐ์ฒด ๋ด์ ๋ฐ๋ก modules
์์ฑ์ผ๋ก ํธ์ถํ๋ค.
๋ค๋ฅธ ์ด๋ฆ์ผ๋ก ํธ์ถํ๊ณ ์ถ๋ค๋ฉด ์ปค์คํ
์ด๋ฆ: ๋ชจ๋๋ช
์ผ๋ก ๊ฐ๋ฅํ์ง๋ง
ํ์ฌ๋ module
๊ฐ์ฒด ๋ด์์ ์์ฑ๋ช
๊ณผ ๊ฐ์ด ๊ฐ์ผ๋ฏ๋ก ํ๋๋ก ์๋ตํ์๋ค.
// index.js
import message from './message'
export default createStore({
// ...
modules: {
message
}
})
๊ทธ๋ผ message.js
๋ชจ๋์ ์ดํด๋ณด์.
์๋ ์ฝ๋์ ๊ฐ์ด ๊ธฐ๋ณธ์ ์ธ Vuex ๊ตฌ์กฐ์ ๋น์ทํ์ง๋ง ํ๋ ์ฐจ์ด์ ์ด ์๋ค.
// message.js
export default {
namespaced: true,
state() { ... },
getters: { ... },
mutations: { ... },
actions: { ... },
}
๋ฐ๋ก namespaced
์์ฑ์ด๋ค.
์ด๊ฒ์ true
๋ก ์ง์ ํ๋ฉด ํด๋น Vuex๋ ํ๋์ ๋ชจ๋ํ๊ฐ ๋์ด Vue ์ปดํฌ๋ํธ์์ ๊ฐ๋ณ ์ด๋ฆ์ผ๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
๋ํ Vue ์ปดํฌ๋ํธ์์ ๋ชจ๋ ๋ด ์ฌ๋ฌ ์์ฑ ๋ฉ์๋๋ฅผ ํ๊บผ๋ฒ์ ๊ด๋ฆฌ ๋ฐ ํธ์ถํ๊ธฐ ์ํด mapํฌํผ๋ฅผ ์ง์ํ๋ค.
...
์ฐ์ฐ์ ํํ๋ก ๋ํ๋ด์ด ...map์ปจ์
๋ช
('๋ชจ๋๋ช
', ['๋ฉ์๋๋ช
'])
ํํ๋ก ํธ์ถ์ด ๊ฐ๋ฅํ๋ค.
์ด๊ฒ ๋ํ ๊ฐ ์ปจ์ ์์ ์ผ์ผ์ด ๋ฉ์๋๋ฅผ ํธ์ถํ์ง ์๊ณ ๋ชจ๋ํํ์ฌ ํธ์ถํ๊ธฐ ๋๋ฌธ์ ์ฝ๋๊ฐ ๊ฐ๊ฒฐํด์ง๊ณ ๊ฐ์ ๊ธฐ๋ฅ๋ณ๋ก ๋ฌถ์ด์ ธ ์์ผ๋ฏ๋ก ์ค๋ฅ ์ถ์ ์ด ๋นจ๋ผ์ง๋ค.
createRouter
๊ฐ์ฒด๋ก routes
์์ฑ์ ํตํด ํน์ ๊ฒฝ๋ก๋ก route ์ค์ ์ ํ ์ ์๋ค.
ํ์ง๋ง ์ง์ ํ ๊ฒฝ๋ก ์ด์ธ์ ๋ชจ๋ ๊ฒฝ๋ก์ ๋ํด์๋ Not Found 404 ์๋ฌ๋ก ํ์ด์ง๊ฐ ์กด์ฌํ์ง ์์์ ๋ํ๋ด ์ค ํ์๊ฐ ์๋ค.
์ด ํ์ด์ง ๋ํ ๋ผ์ฐํฐ ์ค์ ์ ๋ฐ๋ก ํด๋์์ผ ์ค์ ๋ก ์ฌ์ฉ์๊ฐ ์กด์ฌํ์ง ์๋ ํ์ด์ง์ ์ ๊ทผํ์ ๋ ์ธ์ง์์ผ์ค ์ ์๋ค.
ํ์ง๋ง "์ง์ ํ ๊ฒฝ๋ก ์ด์ธ์ ๋ชจ๋ ๊ฒฝ๋ก"๋ผ๋ ์กฐ๊ฑด์ ์ด๋ป๊ฒ ํํํ์ง?
์ด ๋ ์ฌ์ฉํ๋ ๊ฒ์ด :noFound(.*)
ํค์๋์ด๋ค.
๊ดํธ ์ .*
์ ์ ๊ทํํ์์ผ๋ก ์ผ์นํ๋ ๋ชจ๋ ๋ฌธ์๋ฅผ ์๋ฏธํ๋ค.
๋ฐ๋ผ์ ์ฐพ์์ง์ง ์์ ๋ชจ๋ ๋ฌธ์์ด์ ๋ํด์ NotFound
์ปดํฌ๋ํธ๋ฅผ ๋ผ์ฐํ
์์ผ์ฃผ๋ ๊ฒ์ด๋ค.
export default createRouter({
history: createWebHashHistory(),
routes: [
// ...
{
path: '/:notFound(.*)', // ๋๋จธ์ง ๋ชจ๋ ๋ฌธ์ ์ผ์น
component: NotFound
}
]
})
๋๋ถ๋ถ์ ์ฌ์ดํธ๋ค์ ๋ก๊ทธ์ธ ์ ๋ณด๊ฐ ์์ผ๋ฉด ํน์ ํ์ด์ง์ ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํ๋๋ก ๊ตฌํ๋์ด ์๋ค. ์ด๊ฒ์ Vue ๋ผ์ฐํ ์์๋ ๋ค๋น๊ฒ์ด์ ๊ฐ๋์ ๋ฉํ ํ๋๋ฅผ ํตํด ๊ตฌํํ ์ ์๋ค.
ํน์ ํ์ด์ง์ routes
๊ฐ์ฒด์ meta
์์ฑ์ ๋ถ์ฌํด ref
๋ฅผ ํตํด ํน์ DOM๋ฅผ ๋ช
์ํ ์ ์๋ฏ์ด ํน์ ํ์ด์ง๋ฅผ ๋ช
์ํ ์ ์๋ค.
// requiresAuth๋ ์ ๊ทผ๊ฐ๋ฅ์ฌ๋ถ๋ฅผ ๋ํ๋ด๋ ์งํ์ด๋ค.
meta: {
requiresAuth: true
}
์ด๊ฒ๊ณผ ํจ๊ป ๋ค๋น๊ฒ์ด์
๊ฐ๋์์ requiresAuth
๋ฅผ ํ์ธํด์ ํด๋น ๋ผ์ฐํ
ํธ์ถ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ค. ์ด๋ ๋ผ์ฐํ
ํ๊ธฐ์ ์ ์ฒดํฌ๋ฅผ ํ๋ ๊ฒ์ด๋ฏ๋ก beforeEach
๋ฉ์๋์ to
์ธ์๋ฅผ ํตํด ๋ฉํ ํ๋ ๋ด ๋ฐ์ดํฐ๋ฅผ ํ์ธํ๋ค.
// guard.js
router.beforeEach((to) => {
if (to.meta.requiresAuth && !store.state.user.isLoggedIn) {
...
}
})
ํ ํ์ด์ง์์ ์คํฌ๋กค์ ํด์ ๋ด์ฉ์ ๋ณด๋ ์ค ๋น์ทํ ๋ ์ด์์์ ๋ค๋ฅธ ํ์ด์ง๋ก ์ด๋ํ๊ฒ ๋๋ฉด ์คํฌ๋กค ์์น๊ฐ ์ ์ง๋์ด๋ฒ๋ฆฌ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
์ด๊ฒ์ ์ค์ ํ์ด์ง๋ฅผ ๋ค์ ๋ก๋ํ๋ ๊ฒ์ฒ๋ผ ๋งจ ์๋ก ์คํฌ๋กค์ ๋ฆฌ์
ํ ํ์์ฑ์ด ์๋ค.
์ด ๋ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ด scrollBehavior
์ด๋ค.
// routes/index.js
...
history: createWebHistory(), // HTML5 ํ์คํ ๋ฆฌ ๋ชจ๋์์๋ง ์๋๊ฐ๋ฅํ๋ค.
scrollBehavior() {
return {
top: 0
}
},
...
๋ค์๊ณผ ๊ฐ์ด top: 0
์ ์ง์ ํด์ฃผ๋ฉด ์คํฌ๋กค ์์ญ์ ์ต์๋จ์ผ๋ก ์คํฌ๋กค์ด ๋ฆฌ์
๋๋ค.
์ต์ ์ ์ธ ๋์ importํ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ Vue ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ API ์ธํธ์ด๋ค.
์ ์ต์
์ ๋
๋๊ณ Composition API๊ฐ ๋์ค๊ฒ ๋๊ฑธ๊น?
๊ณต์๋ฌธ์์๋ ์๋์ ๊ฐ์ด 3๊ฐ์ง ์ด์ ๋ฅผ ๋ ๋ค.
- ๋ก์ง์ ์ฌ์ฌ์ฉ์ฑ
์ํ ์ ์ฅ ๋ก์ง์ ์บก์ํํด์ ์ฌ์ฌ์ฉ์ฑ์ ํฅ์์์ผ์ ๊น๋ํ๊ณ ํจ์จ์ ์ธ ๋ก์ง ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.- ์ ์ฐํ ์ฝ๋ ๊ตฌ์ฑ
ํ๋ก์ ํธ๊ฐ ์ปค์ง์๋ก ํน์ ๋ก์ง์ ์ ๊ทผํ๊ธฐ ์ํด ์ต์ API๋ ์ฌ๋ฌ ๋ธ๋ก ์ฌ์ด๋ฅผ ์ค๊ฐ๋ฉด์ ์ฒดํฌํด์ผ ํ๋ค.
ํ์ง๋ง Composition API๋ ์ํ ๊ด๋ฆฌ ๋ฐ ์๋ช ์ฃผ๊ธฐ๋ ํจ์ ํํ๋ก ์์ถํ๊ธฐ ๋๋ฌธ์ ์ฅ๊ธฐ์ ์ธ ์ ์ง ๊ด๋ฆฌ๋ฅผ ํ๋๋ฐ ์ ๋ฆฌํ๋ค.- ํ์ ์ถ๋ก ์ ์ ๋ฆฌ
Composition API๋ ์ผ๋ฐ ๋ณ์์ ํจ์๋ฅผ ์ฃผ๋ก ์ฌ์ฉํ๋ฏ๋ก ํ์ ์ ์ถ๋ก ํ๊ธฐ์ ํธ๋ฆฌํ๋ฏ๋ก TS๋ก ์์ฑํด๋ ๋ฌด๋ฐฉํ๋ค.
์ค์ ๋ก Vue ๊ณผ์ ๋ ์ด๋ฅผ ์ฌ์ฉํ๋๋ฐ ์ํ ๊ด๋ฆฌ ๋ฐ ์๋ช ์ฃผ๊ธฐ์ ๋ํ ์ฝ๋ ์์ฑ ๋ฐ ์๋ฌ ํธ๋ค๋งํ ๋ ํธ๋ฆฌํ๋ค!
ref ํจ์๋ฅผ ํตํด์ ์ฐธ์กฐ ๊ฐ์ฒด์ ์ ๊ทผํ๋ ค๋ฉด ๋งค๋ฒ value ์์ฑ์ ์ฐพ์์ผ ํ๋ค.
์ด๋ฅผ ํด๊ฒฐํด ์ค ์ ์๋ ๊ฐ๋
์ด reactive์ด๋ค.
๊ทธ๋ฌ๋ฉด reactive๋ง ์ฌ์ฉํ๋ฉด ๋๋ ๊ฑฐ ์๋๊ฐ? ๋ผ๋ ์๊ฐ์ ํ ์ ์๋ค.
ํ์ง๋ง reactive๋ ์ฐธ์กฐ๊ฐ ๊ฐ๋ฅํ ๊ฐ์ฒด๋ง ๋ค๋ฃฐ ์ ์๋ค. ์๋ฅผ ๋ค์ด ๊ฐ์ฒด๋ ๋ฐฐ์ด ๊ฐ์ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ ์ฐธ์กฐ ๊ฐ์ฒด ํ์
์ด ์๋ ์์ ํ์
์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋๋ ref
๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
reactive ๋ฐ์ดํฐ๋ฅผ watch ํจ์๋ก ๊ฐ์ํ ๋๋ ๋ฐ๋ก deep
์ต์
์ ์ฃผ์ด์ฃผ์ง ์์๋ ๊ฐ์ฒด ๋ด๋ถ ์์์ ๋ณํ๋ฅผ ์๋์ผ๋ก ๊ฐ์งํ ์ ์๋ค.
ํ์ฌ ์ต์ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ pinia์ด๋ค.
ํ์ง๋ง vuex๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ณธ์ ์ธ ์ปจ์
์ ๋น์ทํ์ง๋ง ๋ช ๊ฐ์ง ์ฐจ์ด์ ์ด ์๋ค.
์ฌ๊ธฐ์ ํญ์ ์ข์ ์ ๋ง ์๋ ๊ฒ์ ์๋๋ค. actions ์ปจ์ ์์๋ ๋ฐ์ดํฐ๊ฐ ์์ ์ด ๊ฐ๋ฅํ๊ณ ์ด๋ ํ ๋ชจ๋์์๋ ์ํ ๋ฐ์ดํฐ์ ์ ๊ทผํ๊ณ ์์ ์ด ๊ฐ๋ฅํ๋ฏ๋ก ์์ ์ฑ์ด ๋จ์ด์ง ์๋ ์๋ค.
scss ๋ด ๋ณ์๋ฅผ ์ค์ ํ๊ฒ ๋๋ฉด ํด๋น scss ํ์ผ์ ํญ์ import ํด์์ผ ์ฌ์ฉํ ์ ์๋ค.
ํ์ง๋ง ์ต์์ ํ๊ทธ ๋ด HTML ๋ณ์๋ก ์์๊ณผ ๊ฐ์ ์ ์ญ์ ์ผ๋ก ์ฌ์ฉ๋ ์ ์๋ ๋ณ์๋ฅผ ์ค์ ํ๊ฒ ๋๋ฉด
๋ฐ๋ก import๊ฐ ํ์์์ด var(๋ณ์๋ช
)
์ผ๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ฏ๋ก ์ํฉ์ ๋ง๊ฒ ์ฌ์ฉํ์.
input
ํ๊ทธ์ ์
๋ ฅ๋๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ธ๋ฉํ๊ธฐ ์ํด์๋ v-model
์ด๋ ์ง์ ๋ฐ์ธ๋ฉํ๋ ๋ฐฉ๋ฒ์ด ์๋ค. ํ๊ธ์ ์
๋ ฅํ ๋ ์์ฐ์ค๋ฌ์ด ๋์์ ์ํด์๋ ์ง์ ๋ฐ์ดํฐ๋ฅผ @input ์ด๋ฒคํธ๋ฅผ ํตํด ๋ฐ์์ค๋ ๋ฐฉ๋ฒ์ด ์ ์ ํ๋ค.
ํ์ง๋ง ์ด ๋ $event.target
์ ํตํด DOM์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ค๊ฒ ๋๋๋ฐ TS ์์์๋ ํด๋น ์์๊ฐ ์ด๋ค ํ์
์ธ์ง ์ถ๋ก ์ด ๋ถ๊ฐ๋ฅํ๋ค.
๋ฐ๋ผ์ as ํ์
๋จ์ธ์ ํตํด ํด๋น ์์๊ฐ HTMLInputElement
ํ์
์์ ๋จ์ธํด์ฃผ์ด์ผ ์๋ฌ๊ฐ ๋์ง ์๋๋ค.
๋ฐ๋๋ผ JS๋ก ์ผ์ฃผ์ผ ๋์ ๊ผฌ๋ฐ ๋ง๋ ๋
ธ์
ํด๋ก ํ๋ก์ ํธ๋ฅผ Vue๋ก๋ ๋จ 5์๊ฐ ๊ฐ์๋ก ๋๋ฑ ๋ง๋ค์ด์ง๋ ๊ฒ์ ๋ณด๊ณ ํํ๊ฐ ์ธ๊ฒ ์์๋ค.
์ด๊ฒ ํ๋ ์์ํฌ์ ์๋ ฅ์ธ๊ฐ๋ผ๋ ๊ฒ์ ์ค๊ฐํ๋ค. ๋ฌด์๋ณด๋ค ์ํ ๊ด๋ฆฌ๊ฐ ์์ฒญ๋๊ฒ ํธ๋ฆฌํ๊ณ ๊ทธ์ ๋ฐ๋ฅธ UI๋ฅผ ์ ์ดํ๋ ๊ฒ๋ ๊ฐ๊ฒฐํ ์ฝ๋๋ก ๊ฐ๋ฅํ ๊ฒ์ด ์์ฒญ๋ ๋ฉ๋ฆฌํธ์๋ค.
๋ฌผ๋ก ๋ฐ๋๋ผ JS๋ก ๊ตฌํํ๋ฉด์ ๊ธฐ๋ณธ์ ์ธ ์๋ฆฌ๋ฅผ ์ด๋ ์ ๋ ๊ณต๋ถํ๊ธฐ์ Vue ํ๋ ์์ํฌ์ ๋ชจ๋ํ ๋ฐ ์ฌ์ฌ์ฉ์ฑ์ ํ๋ํ ํ
ํ๋ฆฟ ๋ฌธ๋ฒ์ด ๋ ํฌ๊ฒ ์ ๋ฟ์๋ค.
๋ฐ๋๋ก ๋งํ๋ฉด ๋ฐ๋๋ผ JS๋ฅผ ์ ๋ค๋ฃจ์ง ๋ชปํ๋ฉด ํ๋ ์์ํฌ๋ ์ฃฝ์ค๊ฒ ๋ค๋ ๊นจ๋ฌ์์ ์ป์๋ค.
๋ ๋ฒ์งธ ์ค์ต์ผ๋ก๋ Todo List ํ์ด์ง๋ฅผ ๋ง๋๋ ์ค์ต์ด์๋ค.
๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ด๋ผ๊ณ ํ ์ ์๋ Todo List ๊ธฐ๋ฅ๋ค์ด์์ง๋ง ๊ณ ๋ คํด์ผํ ์ค์ํ ๋ถ๋ถ๋ค์ด ์์๋ค.
@keyframes
Transition
vercel.json
๋ผ์ฐํ
์ค์ ๋ณด๊ธฐ์๋ ๊ฐ๋จํ Todo List ํ์ด์ง๊ฐ ์ด๋ ๊ฒ๋ ๋ง์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ค์ ๋ค์ด ํ์ํ๋ค๋ ๊ฒ์ ๋ฐฐ์ฐ๋ฉด์ Vue ๊ณผ์ ๋ฅผ ์ํํ๋ ๋ฐ ํฐ ๋์์ ์ป์๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก ์๋น์ค๋ฅผ ๊ฐ๋ฐํ๋ฉด์ ์์ ๊ฐ์ ํฌ์ธํธ๋ค์ ํญ์ ๊ณ ๋ คํ๋ฉด์ ์์ธ์ ์ธ ์๋ฌ ํธ๋ค๋ง ๋ฐ ๋ณด์์๋ ์ฒ ์ ํ ๊ด๋ฆฌ์ ๋ฐฉ์ด์ฝ๋๊ฐ ํ์ํ๋ค๋ ๊ฒ์ ์๊ฒ ๋์๋ค.
Vue ๊ณผ์ ๋ฅผ ๋ฌด์ฌํ ์๋ฃํ๋ค. ๋ฐฐํฌ ๋งํฌ
๊ณผ์ ๊ธฐ๋ณธ ๋ฐ ์ถ๊ฐ ์๊ตฌ์ฌํญ๊น์ง ํด๊ฒฐ์ ๋ค ํ๋ค!! ๋ฟ๋ฏํ๋ค!!
ํ์ง๋ง ์์ง๊น์ง ๋ฐ์ํ CSS๋ฅผ ์ ์ฉํ์ง ๋ชปํ๊ณ ๋ค๋ฅธ ํ๋กฑ์ด๋ค์ ์ฌ์ดํธ์์ ์ค์ผ๋ ํค UI๋ ์ ๋ ฌ ๊ธฐ๋ฅ, ๋ฌดํ ์คํฌ๋กค์ ๊ตฌํํ ๊ฒ์ ๋ณด๊ณ ๋ค์ํ๊ณ ํกํก ํ๋ ์์ด๋์ด๋ฅผ ๋ด ํ๋ก์ ํธ์๋ ์ ์ฉ์์ผ๋ณด๋ฉด ์ข๊ฒ ๋ค๋ ์๊ฐ์ ํ๋ค.
(๋ฑ ์์ฑํ์ ๋ ๋นํ์ด ์์ด๋ณด์์ง๋ง... ์ค๋ง๊ณผ ํธ๊ฒฌ?!)
๋๊ตฐ๊ฐ๋ Vue ์ด์ฐจํผ ์ ์ธ ๊ฒ์ด๋ผ๊ณ ๋ฑํ์ํ๋ ์ฌ๋๋ ๋ถ๋ช ํ ์์ ๊ฒ์ด์ง๋ง ๋ Vue๋ ์ธ์ ๊ฐ๋ ์ฐ๊ฒฐ๋์ด ํ๋ก ํธ์๋ ๊ฐ๋ฐํ ๋ ๋์์ด ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ค. ๊ทธ๋ฌ๊ธฐ์ ๊ธฐ์ด๋ถํฐ ๊ณผ์ ์ํ๊น์ง ์ ๋ง ์ด์ฌํ ์ต์ ์ ๋คํ ๊ฒ์ด ์ํ๋ค๊ณ ์ค์ค๋ก์๊ฒ ์นญ์ฐฌํด์ฃผ๊ณ ์ถ๋ค. React๋ก ๊ธฐ์ด๋ถํฐ ์ฐจ๊ทผ์ฐจ๊ทผ ๊ทธ๋ฆฌ๊ณ ์๊ทผ์๊ทผ ์น์ด๋จน์ด๋๊ฐ์ผ๊ฒ ๋ค.
Vue ๊ณผ์ ๋ฅผ ํ๋ฉด์ ์์ง๊น์ง API๋ฅผ ๋ค๋ฃฐ ๋ axios๋ฅผ ์ฌ์ฉํ๋ ๋ฐ ๋ฅ์ํ์ง๊ฐ ๋ชปํ๋ค. ๊ฐ์์์ ์งํํ ์๋ฒ๋ฆฌ์ค ํจ์๋ฅผ ๋ฒค์น๋งํน์ด๋ผ ์ฝ๊ณ ๊ฑฐ์ ๋ณต์ ํด์์ ์กฐ๊ธ ์์ ๋ง ํ๋ค.
์ฉ์ผ๋ก ์๋ก์ด api์ ๋ํ ์๋ฒ๋ฆฌ์ค ํจ์๋ฅผ ๋ง๋ค๋ผ๊ณ ํ๋ฉด ๊ณผ์ฐ ํ ์ ์์๊น ์๋ฌธ์ด๋ค. ๋คํธ์ํฌ ์์ฒญ์ ๋ํ cs ์ง์๊ณผ axios์ ๋ํ ์ถ๊ฐ์ ์ธ ๊ณต๋ถ๊ฐ ๋ถ๊ฐํผํ๋ค.
๋๋๋ฆฌ.. ์ด์ React๋ฅผ ๋ฐฐ์ฐ๊ธฐ ์์ํ๋ค. ๋ชจ๋ฅ๋ฆฌ ์ฑ ์ Ebook์ด ์์ง ๋์ค์ง ์์ ๋์ค๋ฉด ์ด ์์ ์ด๋ค. ๊ฐ์ ํ ์ธํ๋์ด ์ฑ ์ด ๊ด์ฐฎ๋ค๊ณ ํ์ ํด์ฃผ์ ์ ๋์ฑ ๋ ๊ตฌ๋งค์์ฌ๊ฐ ํ์คํด์ก๋ค. ๋ ์คํด๋ฝ๋ ๋ค์ด๊ฐ์ ๋ฆฌ์กํธ ๊ณต์๋ฌธ์๋ฅผ ์ฝ๊ธฐ๋ก ๋ด ์์ ๊ณผ ์ฝ์ํ๋ค. React ๊ฐ์๊ฐ ์ ํ๋์ด ์งํํ์๋ฏ๋ก ๊ฐ๋จํ ์์ฝ ๊ฐ์๊ฐ ๋ง์ ๊ฒ์ผ๋ก ์์๋๋ค. ๋ฐ๋ผ์ ๊ฐ์ ๋ด์ฉ์ ๋ํ ๊ณต์๋ฌธ์ ์ ๋ ์ ๊ฐ์ด ๋ณํํ ์์ ์ด๋ค. ๊ฐ์๊ฐ ์งง๋ค๊ณ ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ๋ค์๋ค๊ณ ๋ด๊ฒ์ด ๋๋ ๊ฒ์ด ์๋๊ธฐ์ ๋ช ์ฌํ์.
๊ทธ๋๋ 2์ฃผ ๋์ Vue์ ๋ํด์ ์์ ๋ชจ๋ฅด๊ณ ์๋ค๊ฐ ๋น๋ก ๊ณผ์ ์ด์ง๋ง Vue ๊ฐ์ง๊ณ ํ๋์ ๋ฐฐํฌ ์ฌ์ดํธ๋ฅผ ๋ง๋ค์ด๋ณด๋ฉด์ ๋ ํ ๋จ๊ณ ์ฑ์ฅํ ๊ฒ์ ๋ชธ์ ๋๋ ์ ์๋ ๊ธฐํ์๋ค. ์ด๋๋ก๋ง ์ญ ๊ฐ๋ณด์๊ณ !
๐ ํด๋น ๋ด์ฉ์ ๊ณต๋ถํ๋ฉด์ ์ ๋ฆฌํ ๊ธ์ ๋๋ค. ํ๋ฆฐ ๋ถ๋ถ์ด๋ ์คํดํ๊ณ ์๋ ๋ถ๋ถ์ด ์๋ค๋ฉด ํผ๋๋ฐฑ ๋ถํ๋๋ฆฝ๋๋ค.
๊ธฐ์กดTIL ํ์์ธ๊ฑฐ๊ฐ์๋ฐ WIL๋ก ์๋ด๊ฒจ์๋ค์ ์ฐ์~ ์ต๋ฅ๋ ํ์ดํ