2022. 3. 7. 23:29ใFront-End ์์ ์ค/Vue.js
๐ ๋ชฉ์ฐจ
[Vue.js] ๊ธฐ์ด ๊ฐ๋
์ ๋ฆฌ - ๊ธฐ๋ณธ ํ๊ฒฝ ๊ตฌ์ฑ
[Vue.js] ๊ธฐ์ด ๊ฐ๋ ์ ๋ฆฌ - Vue Router
[Vue.js] ๊ธฐ์ด ๊ฐ๋ ์ ๋ฆฌ - Vue LifeCycle Hook
[Vue.js] ๊ธฐ์ด ๊ฐ๋ ์ ๋ฆฌ - data(), Data ์ฒ๋ฆฌ
[Vue.js] ๊ธฐ์ด ๊ฐ๋ ์ ๋ฆฌ - Watch, Array, for๋ฌธ(๋ฐ๋ณต๋ฌธ), if๋ฌธ
๐ฑ Git Hub ์ฃผ์ : https://github.com/junyharang-FrontEnd-coding-study/vue.js-study
๐ ์ฐธ๊ณ ์๋ฃ : https://www.youtube.com/watch?v=sqH0u8wN4Rs
๐ VueRouter ๋?
Vue ์์ Routing ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์๋๋ก ์ง์ ํด ์ฃผ๋ ๊ณต์ Library ์ธ ๊ฒ์ด์์.
์ฌ๊ธฐ์ Routing์ด๋ผ๋ ๊ฒ์ Web Paging ๊ฐ์ ์ด๋ํ๋ ๋ฐฉ๋ฒ์ ๋งํ๋ ๊ฒ์ด์์.
๊ธฐ์กด์๋ ์ด์ฉ์๊ฐ Menu๋ฅผ Click ํ๊ฑฐ๋, ํน์ Button์ Clickํ๊ฒ ๋๋ฉด ์ฐ๋ฆฌ์ Web Site ์์์ ํน์ Page๋ก ์ด๋ํ ๋, Server์ ์์ฒญ์ ํ๊ณ , ์๋ก์ด Page๋ฅผ ๋ฐ์์ค๋ ํ์์ผ๋ก ์ด๋ค์ง๊ฒ ๋์์๋ ๊ฒ์ด์์.
Router๋ผ๋ ๊ฐ๋
์ Vue.js ๊ธฐ๋ฐ ์น์ SPA(Sing Page Application)์ด๊ธฐ ๋๋ฌธ์ ๋จ์ผ Page์์์?
๋ฏธ๋ฆฌ ํด๋นํ๋ Component Page๋ฅผ ๋ค ๋ฐ์ ๋๊ณ , Routing์ ์ด์ฉํด์ ์๋กญ๊ฒ ๋ณ๊ฒฝ๋ ๋ถ๋ถ๋ง ํ๋ฉด์ ๊ฐฑ์ ํ๋ ๊ฒ์ ๋งํ๋ ๊ฒ์ด์์.
Vue ๋ฟ๋ง ์๋๋ผ, React, Angular๋ ๋์ผํ๊ฒ Routing์ ์ด์ฉํด์ ํ๋ฉด์ ์ ํํ๋ ๊ฒ์ด์์.
ํด๋น Project Package์์ ์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅ ํด ์ฃผ๋ฉด ๋๋ ๊ฒ์ด์์.
๐ Layout
์ด์ src/components/ ์ด ๊ณณ์ layout์ด๋ผ๋ Directory๋ฅผ ํ๋ ๋ง๋ค ๊ฒ์ด์์.
๋ณดํต Web site๋ฅผ ๋ณด๋ฉด ์๋จ์ Menu Bar๊ฐ ์๊ณ , ํ๋จ์ Footer, ๊ฐ์ด๋ฐ์ Contents ๋ฑ์ด ์๋๋ฐ, ์๋จ์ Menu๊ฐ ๋ฐ๋ ๋๋ง๋ค ๊ฐ์ด๋ฐ Contents๊ฐ ๋ฐ๋๋ ๋ฐฉ์์ผ๋ก ๊ตฌ์ฑ์ ํ๋๋ฐ, ์ฌ์ค ์๋จ์ Menu๋ ๊ณ ์ ์ด๊ณ , ๋ค์ Page๋ฅผ ๊ฐฑ์ ํ ํ์๊ฐ ์๋ ๋ถ๋ถ์ด๊ธฐ ๋๋ฌธ์ ๊ทธ๋ฐ ๊ธฐ๋ณธ์ ์ธ ๊ฒ๋ค์ layout Directory์ ๋ง๋ค์ด ์ค ๊ฒ์ด์์.
๋จผ์ ์๋จ์ ๋ํ๋ด๋ `Header.vue`๋ฅผ ๋ง๋ค์ด ์ฃผ๋๋ก ํ ๊ฒ์ด์์.
Menu Bar๋ Bootstrap์ ์ด์ฉํ ๊ฒ์ธ๋ฐ, Vue ์ ์ฉ์ผ๋ก๋ค๊ฐ ๋ง๋ค์ด ์ค ๊ฒ์ด์์.
์ฌ๊ธฐ `Get started`๋ฅผ ๋๋ฌ ์ฃผ์ธ์!
์ ์ฌ์ง์์ with npm ๋ฐฉ์์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํด์ bootstrap-vue๋ฅผ ์ค์นํ ๊ฒ์ด์์.
์ ๋ช ๋ น์ด๋ฅผ ํตํด Bootstrap๊ณผ Bootstrap Vue๊ฐ Module ํํ๋ก `node_modules` Package์ Download๊ฐ ๋๋ ๊ฒ์ด์์.
์์ ๊ฐ์ด ๋ ๊ฐ๊ฐ ์ ๋ฐ์์ก๋ค์!
ํ์ง๋ง, ์ ๋ ๊ฒ ๋ฐ์๋จ๋ค๊ณ ํด์ ๋ฐ๋ก ์ฌ์ฉํ ์ ์๋ ์ํ๋ ์๋ ๊ฒ์ด์์. ๋ฐ๋ก ์ถ๊ฐ ์์ ์ด ํ์ํ ๊ฒ์ด์ง์. import!
main.js์ ์๋ ๋ด์ฉ์ ์ถ๊ฐ ํด ์ค ๊ฒ์ด์์.
์ ๋ถ๋ถ์์ ์ฃผ๋ํ๋์ ์๋ ๋ด์ฉ์ ์ถ๊ฐ ํ ๊ฒ์ด์์.
์์ ๊ฐ์ด Bootstrap๊ณผ ํจ๊ป Design๋ ์ฌ์ฉํด์ผ ํ๋ CSS ๋ด์ฉ๋ ์ถ๊ฐ ํด ์ค ๊ฒ์ด์์.
์ด์ Layout Header์ Menu Bar๋ฅผ ๋ฃ์ด์ค ๊ฒ์ด์์.
์์ ๊ฐ์ด ์ด๋์ ํด ์ค ๋ค์ ์๋ html ๋ด์ฉ์ ๋ณต์ฌ ๋ถ์ฌ๋ฃ๊ธฐ ํ ๊ฒ์ด์์.
๊ทธ ์ ์! Vue๋ ๊ธฐ๋ณธ์ ์ผ๋ก `<template>` ์ผ๋ก ๊ฐ์ธ์ง ๋ถ๋ถ๊ณผ `<script>`๋ก ๊ฐ์ธ์ง ๋ถ๋ถ์ด ์๋๋ฐ,
`<template>`์๋ html Code๊ฐ ๋ค์ด๊ฐ๋ ๋ถ๋ถ
`<script>`๋ html์ Data๋ฅผ ๋ฐ์ธ๋ฉ ํ๊ฑฐ๋, Server์ ํต์ ๋ฑ์ ํ๊ธฐ ์ํ JavaScript Code๊ฐ ๋ค์ด๊ฐ๋ ๋ถ๋ถ
์์ Html Code๋ ๋น์ฐํ `<template>`์์ ๋ฃ์ด ์ฃผ๋๋ก ํ ๊ฒ์ด์์.
๊ทธ๋ฐ ๋ค์ `<script>` ์์ `export default`์์๋ ์ด Component๊ฐ ๋ฌด์์ธ์ง๋ฅผ ์ง์ ํ ๊ฒ์ธ๋ฐ, ์ด๋ฆ์ header๋ผ๊ณ ์ง์ ํด ์ค ๊ฒ์ด์์.
๊ทธ ๋ค์์ `views`๋ผ๋ Directory๋ฅผ ๋ง๋ค์ด์ ์ค์ Page๋ฅผ ์ด ๊ณณ์ ๋ง๋ค์ด ์ค ๊ฒ์ด์์.
๐ App.vue
์ด ๋ถ๋ถ์ด ๊ฐ์ฅ ์ค์ํ ๋ถ๋ถ ์ค ํ๋์ธ ๊ฒ์ด์์.
Vue cli๋ฅผ ํตํด ์ค์น๋ฅผ ํ๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ณธ์ ์ธ ๋ด์ฉ์ด ๋ค์ด ์๋ ๊ฒ์ ๋ณผ ์ ์๋ ๊ฒ์ด์์.
์์ App.vue๊ฐ ์๋ ์ฒ๋ผ Browser์ ์ถ๋ ฅ ๋๋ ๊ฒ์ด์์.
์ด์ ์๊น ๋ง๋ layout/Header.vue๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์ ๊ธฐ์กด์ ์๋ Code๋ฅผ ์๋์ ๊ฐ์ด ์์ ํ ๊ฒ์ด์์.
importํ Header๋ฅผ ./(ํ์ฌ Dircetory) ๋ฐ์ compponets ๋ฐ์ layout ๋ฐ์ Header.vue์์ ๊ฐ์ ธ์ค๊ณ , ์ด๋ฅผ 13๋ฒ์งธ Line์์ Components๋ก ๋ฑ๋ก ํด ์ฃผ๊ฒ ๋ค๋ ์๋ฏธ ์ธ ๊ฒ์ด์์.
์ด๋ ๊ฒ ํ๋ฉด html์ ์์ฑํ๋ `<template>` ์์์ ํด๋น Components๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ด์์.
Header ๋ฐ์๋ Contents๊ฐ ๋ค์ด๊ฐ๋ ๋ถ๋ถ์ผ๋ก ํ๋ฉด์ด ๊ฐฑ์ ๋๋ ๋ถ๋ถ์ด๊ธฐ ๋๋ฌธ์ router๊ฐ ๋ค์ด๊ฐ์ผ ํ๋ ๊ฒ์ด์์.
์ฆ ํ๋ฉด์ด ๋ฐ๋๋ ๋ถ๋ถ์ `<router-view></router-view>` ์ด ๋ถ๋ถ์ ํตํด Re Loading ํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌ์ฑํ๋ ๊ฒ์ด์์.
์ด์ ํ๋ฉด ์ฒ๋ฆฌ๋ฅผ ์ํด views ๋ฐ์ Home.vue๋ฅผ ๋ง๋ค์ด ์ค ๊ฒ์ด์์.
Home์๋ ๋จผ์ h1 Tag๋ฅผ ํตํด ์์ ๊ฐ์ด ์์ฑ ํด ์ค ๊ฒ์ด์์.
๊ทธ๋ฐ ๋ค์ About.vue๋ ๋ง๋ค์ด ์ค ๊ฒ์ด์์.
๊ทธ๋ฆฌ๊ณ ์์ ๊ฐ์ด ์์ฑ์ ํด ์ฃผ๋๋ก ํ ๊ฒ์ด์์.
์ฆ, ์์ App.vue์์ `<router-view></router-view>` ๋ถ๋ถ์ด ์ํฉ์ ๋ฐ๋ผ Home.vue๊ฐ ๋์ค๊ฑฐ๋, About.vue๊ฐ ๋์ค๋๋ก ํ๊ธฐ ์ํด ์ด๋ ๊ฒ ํ๊ณ ์๋ ๊ฒ์ด์์.
์์ง์ Router์ ๋ํ ์ค์ ์ด ๋ ๊ฒ์ ์๋๊ธฐ ๋๋ฌธ์ ์๋ ์ฒ๋ผ /src ๋ฐ์ router.js๋ฅผ ๋ง๋ค์ด ์ค ๊ฒ์ด์์.
์์ ๊ฐ์ด vue์ vue-router๋ฅผ import ํด์ฃผ๊ณ , Home, About Components๋ import ํด ์ฃผ๋ ๊ฒ์ด์์.
์์ ๊ฐ์ด router๋ฅผ ์ค์ ํ๊ฒ ๋๋ฉด ์ค์ Path๊ฐ ๋ฐ๋ ๋๋ง๋ค ๋ฏธ๋ฆฌ ๋ง๋ค์ด ๋์ Component๊ฐ ๋ง๋ค์ด ์ ธ์ App.vue์ `<router-view></router-view>` ์ด ๊ณณ์ ํด๋น Component๋ฅผ ๋ถ์ด์์ Loading ์ํค๋ ๊ฐ๋ ์ธ ๊ฒ์ด์์.
์ฆ, ์ ์ฒด Page๋ ๊ฐ๋งํ ์๋ ์ํ์์ `<router-view></router-view>` ์ด ๋ถ๋ถ๋ง Page Component๋ฅผ ๊ฐ์ ธ์์ ๋ฐ๋๋ ๊ฐ๋ ์ธ ๊ฒ์ด์์.
๋ณธ๊ฒฉ์ ์ผ๋ก route๋ฅผ ์ด์ฉํ๊ธฐ ์ํด์ main.js์์ ์ ์ธ์ ํด์ค์ผ ํ๋ ๊ฒ์ด์์.
์์ ๊ฐ์ด 3๋ฒ์งธ ์ค ์ฒ๋ผ import๋ฅผ ํด ์ฃผ๋ฉด ๋๋ ๊ฒ์ด์์.
๊ทธ๋ฆฌ๊ณ , new Vue()์์ 18๋ฒ์งธ ์ค์ฒ๋ผ router๋ฅผ ์ ์ ํด ์ฃผ๋ฉด ๋๋ ๊ฒ์ด์์.
์ฆ, App์ Mount ํ ๋, router๋ฅผ ์ธ ์ ์๊ฒ ํด ์ค ๊ฒ์ด๋๋๋ค.
์์ ๋ช ๋ น์ด๋ก Web์ ๊ธฐ๋ ์์ผ ์ค ์ ์๋ ๊ฒ์ด์์.
๐ VueRouter ๋ฐ์ดํฐ ์ ๋ฌ
Vue Router๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ๋ฒ์ ๋ ๊ฐ์ง๊ฐ ์๋ ๊ฒ์ด์์.
1. Query
2. Parmas
๊ทธ๋ฆฌ๊ณ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์๊ณผ ์ ์ธ์ ๋ฐฉ์์ด ์กด์ฌํ๋ ๊ฒ์ด์์.
โ Query
| {name : 'Query', query: {name: 'Full Stack ์ฃผ๋ํ๋', age: 0 }}
โParmas
| {name : 'Params', Params: {name: 'Full Stack ์ฃผ๋ํ๋ 1', age: 1 }}
์์ ๊ฐ์ ํํ๋ก Data๋ฅผ ๋ณด๋ผ ์ ์๋๋ฐ, name์ ๊ฐ๋ฐ์๊ฐ ์์ฑํ Router ํ์ผ ์์ ์์ฑ๋ name๊ณผ ๋์ผํด์ผ ํ๋ ๊ฒ์ด์์.
์์ ์ฝ๋
import Vue from 'vue';
import VueRouter from 'vue-router';
import Main from '@/views/Main.vue';
import Query from '../views/Query.vue';
Vue.use(VueRouter);
const routes = [
{
path: '/',
name: 'Main',
component: Main
},
{
path: '/Query',
name: 'Query',
component: Query,
},
{
path: '/Params',
name: 'Params',
// route level code-splitting
// this generates a separate chunk (about.[hash].js) for this route
// which is lazy-loaded when the route is visited.
component: () => import(/* webpackChunkName: "about" */ '../views/Params.vue'),
// true๋ก ์ค์ ํ๋ฉด ๋ฐ์ดํฐ๋ฅผ props๋ก๋ ๋ฐ์ต๋๋ค.
props: true,
},
];
const router = new VueRouter({
mode: 'history',
base: process.env.BASE_URL,
routes,
});
export default router;
Params๋ก ๋ฐ์ดํฐ๋ก๋ฅด ์ ๋ฌ ํ ๋, router Option์์ props: true๋ก ์ค์ ํ๋ฉด props๋ก ๊ฐ์ ๋ฐ์ ์ ์๋ ๊ฒ์ด์์.
<template>
<div>
Main
<div>
<router-link to="/">Main ํ์ด์ง๋ก</router-link>
</div>
<div>
<br />
<div>
<button @click="clickList">Query ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์</button>
</div>
<br />
<div>
<router-link
:to="{ name: 'Query', query: { name: 'Query ์ ์ธ์ ๋ฐฉ์', age: 1 } }"
>
Query ์ ์ธ์ ๋ฐฉ์
</router-link>
</div>
<br />
<div>
<button @click="clickParams">Params ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์</button>
</div>
<br />
<div>
<router-link
:to="{
name: 'Params',
params: { name: 'Params ์ ์ธ์ ๋ฐฉ์', age: 1 },
}"
>
Params ์ ์ธ์ ๋ฐฉ์
</router-link>
</div>
</div>
<router-view />
</div>
</template>
<script>
export default {
name: "App",
methods: {
clickList() {
this.$router.push({
name: "Query",
query: { name: "Query ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์", age: 2 },
});
},
clickParams() {
this.$router.push({
name: "Params",
params: { name: "Params ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์", age: 2 },
});
},
},
};
</script>
๐ VueRouter ์ฃผ์(URI)๋ก ์ด๋
Router ์ ๋ณด๊ฐ ์ค์ ๋์๋ค๋ฉด ๊ฐ๊ฐ ํด๋น๋ Page, Router๋ก ์ด๋ ํ ์ ์๋ ๊ฒ์ด์์. ์ด ๋, ์ด๋ํ๋ ๋ฐฉ๋ฒ์ moveTo() ๋ฑ์ ๋ง๋ค์ด `$router.push()` ๋ฐฉ๋ฒ์ผ๋ก ์ด๋ ํ๊ฑฐ๋, ์๋๋ฉด `<router-link>` Component๋ฅผ ์ด์ฉํด์ ์ด๋ํ ์ ์๋ ๊ฒ์ด์์.
router-link Component๋ ํด๋น Elment๋ฅผ ํด๋ฆญํ๊ฒ ๋๋ฉด ์๋์ผ๋ก ํด๋น Route ์ทจ์น๋ก ์ด๋ํ๋๋ก Link๋ฅผ ์์ฑ ํด ์ฃผ๋ ๊ฒ์ด์์. ๋ง์ฝ Home๊ณผ SiteList๋ก ์ด๋ํ๋ Link๋ฅผ ๊ฐ๊ฐ ๋ง๋ ๋ค๋ฉด ์๋์ ๊ฐ์ด ๋ง๋ค ์ ์๋ ๊ฒ์ด์์.
<router-link :to="/">Home<router-link>
<router-link :to="/siteList">SiteList<router-link>
'Front-End ์์ ์ค > Vue.js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Vue.js] ๊ธฐ์ด ๊ฐ๋ ์ ๋ฆฌ - data(), Data ์ฒ๋ฆฌ (0) | 2022.03.08 |
---|---|
[Vue.js] ๊ธฐ์ด ๊ฐ๋ ์ ๋ฆฌ - Vue LifeCycle Hook (0) | 2022.03.08 |
[Vue.js] ๊ธฐ์ด ๊ฐ๋ ์ ๋ฆฌ - ๊ธฐ๋ณธ ํ๊ฒฝ ๊ตฌ์ฑ (0) | 2022.03.07 |
[React] Router Dom (0) | 2021.10.09 |
[Reacte] Array์ shouldComponentUpdate() (0) | 2021.10.04 |