vue_20220124
- 프로젝트 생성
-- 1. nodejs 다운로드 v16.13.1
https://nodejs.org/ko/
-- 2. CMD를 열고 Node.js 기반 vue 프로젝트 생성 프로그램 설치
CMD> npm i vue @vue/cli -g
-- 3. 설치 확인
CMD> vue --version
4.5.15설치됨.
-- 프로젝트 생성(node_modules가 자동으로 생성)
CMD> vue create vue_20220124
-- 프로젝트를 실행하기 위한 폴더 이동
-- package.json, package-lock.json파일이 있는 폴더로 이동하기
CMD> cd vue_20220124
-- router 사용
CMD> npm install vue-router@next --save
-- store 사용
CMD> npm install vuex@next --save
-- axios 사용
CMD> npm install axios --save
-- element-plus ui 사용
CMD> npm install element-plus --save
-- 서버구동
CMD> npm run serve
index.js
- 라우터 설정
npm install vue-router@next --save
파일명 : src/routes/index.js
import { createWebHashHistory, createRouter } from "vue-router";
라우트 설정하기
import Home from '@/components/Home.vue';
import Board from '@/components/Board.vue';
import Login from '@/components/Login.vue';
const routes = [
{ path : '/', name: "Home", component:Home},
{ path : '/board', name: "Board", component:Board},
{ path : '/login', name: "Login", component:Login},
]
const router = createRouter({
history : createWebHashHistory(), // 127.0.0.1:8080/#/login ('#' 붙음)
routes : routes // 위의 routes와 이름 같게 해야함
})
router.beforeEach((to, from, next)=>{
console.log('이동하는페이지 : ', to);
console.log('이동 전 페이지 : ', from);
next(); // 다음페이지 이동
})
export default router;
main.js
import { createApp } from 'vue';
import App from './App.vue';
import routes from './routes/index.js';
// 1. 객체생성
const app = createApp(App);
// *** 2. 여기에 필요한 라이브러리 설정하기
app.use(routes);
// 3. 마운트
app.mount('#app');
Login.vue
- vbase-3-
- ver 3.0 문법 사용
data()
에 넣지않고 setup()
에 넣음setup()
안으로, 리턴값 필수reactive
를 import
해줌 (자동으로 하는듯함)return
값을 줘야함return {state, handleLogin}
<script>
import { reactive } from '@vue/reactivity'
export default {
// 이제 여기에 함
// ver 3.0
setup () {
// this를 사용할수 없음
const state = reactive({
userid : 'aaa',
userpw : 'bbb'
});
const handleLogin = () => {
// alert('로그인 버튼 클릭!');
console.log('로그인버튼 클릭', state.userid, state.userpw);
};
// 리턴값 필수
return {state, handleLogin}
},
// 상태변수 원래 이렇게 함.
// data(){
// return{
// state : {
// userid : 'aaa',
// userpw : 'bbb'
// }
// }
// },
// 메소드 위치도 setup 안으로
// methods:{
// handleLogin(){
// // 백엔드 연동
// }
// }
}
</script>
Board.vue
<template>
<div>
<h3>Board.vue</h3>
{{ state.items.result }}
<table border="1">
<tr>
<th>번호</th>
<th>제목</th>
<th>작성자</th>
<th>조회수</th>
</tr>
<tr v-for="tmp in state.items.result" :key="tmp">
<td>{{tmp.no}}</td>
<td>{{tmp.title}}</td>
<td>{{tmp.writer}}</td>
<td>{{tmp.hit}}</td>
</tr>
</table>
</div>
</template>
<script>
import { onMounted } from '@vue/runtime-core'
import { reactive } from '@vue/reactivity'
export default {
// onCreate에 해당
setup () {
const state = reactive({
items : {},
});
onMounted(() => {
// 백엔드로부터 데이터를 받음
state.items.result = [
{no:1, title:'가1', writer:'a', hit:5},
{no:2, title:'나1', writer:'b', hit:7},
{no:3, title:'다1', writer:'c', hit:9}
];
});
// console.log(state.items.result);
return {state}
}
}
</script>
<style lang="scss" scoped>
</style>
Admin.vue
+ admin/Menu1.vue
- props
<menu-1 v-if="menu.code === 1" title="admin/Menu1.vue"></menu-1>
menu-1 v-if="menu.code === 1"
title="메뉴1"
:count="count.value"
@handleCount="handleCount"></menu-1>
<template>
<div>
<h3>Admin.vue</h3>
{{menu}}
<button @click="handleMenu(1)">메뉴1</button>
<button @click="handleMenu(2)">메뉴2</button>
<button @click="handleMenu(3)">메뉴3</button>
<button @click="handleCount">1씩 증가</button>
<!-- <button @click="handleNext">다음페이지</button> -->
<hr>
<menu-1 v-if="menu.code === 1"
title="메뉴1"
:count="count.value"
@handleCount="handleCount"></menu-1>
<menu-2 v-if="menu.code === 2"
title="메뉴2"
:count="count.value"
@handleCount="handleCount"></menu-2>
<menu-3 v-if="menu.code === 3"
title="메뉴3"
:count="count.value"
@handleCount="handleCount"
@handleSub="handleSub"></menu-3>
</div>
</template>
<script>
import { reactive } from '@vue/reactivity';
import Menu1 from '@/components/admin/Menu1';
import Menu2 from '@/components/admin/Menu2';
import Menu3 from '@/components/admin/Menu3';
export default {
components : {
Menu1, Menu2, Menu3
},
setup () {
// state 변수설정
// menu.code
const menu = reactive(
{ code : 1 }
);
const count = reactive(
{ value : 1 }
);
// count.value 값이 1씩 증가
const handleCount = () => {
count.value++;
};
const handleSub = () => {
count.value--;
}
// handle 메소드
const handleMenu = (idx) => {
console.log(idx);
menu.code = idx;
}
return {menu, count, handleMenu, handleCount, handleSub}
}
}
</script>
<style lang="scss" scoped>
</style>
/admin/Menu1.vue
- props
props : { title : String, count : Number },
<button @click="handleCount">부모 메소드 호출 후 값 증가</button>
{emit}
사용emit('handleCount',{});
handleMenu(1)
의 1 자리setup (props, {emit}) {
const handleCount = () => {
// 부모의 @handleCount="실제호출메소드"가 반응
emit('handleCount',{이부분은 호출 값 자리});
};
return {props, handleCount}
}
<template>
<div>
<h3>Menu1</h3>
{{'props => '+props}}
<br>
{{'props.title => '+props.title}}
<br>
{{'props.count => '+props.count}}
<br>
<hr>
<button @click="handleCount">부모 메소드 호출 후 값 증가</button>
</div>
</template>
<script>
export default {
// 부모 컴포넌트에서 전달되는 값을 보관
props : {
title : String,
count : Number
},
setup (props, {emit}) {
console.log('props.title => ',props.title);
console.log('props.count => ',props.count);
const handleCount = () => {
// 부모의 @handleCount="실제호출메소드"가 반응
emit('handleCount',{});
};
return {props, handleCount}
}
}
</script>
<style lang="scss" scoped>
</style>