이제 실제로 내가 뷰 프로젝트를 개발해보도록 하겠다.
백쪽은 JPA로 구현할거라서 우선, 통신은 구현하지않고 화면이랑 공통 레이아웃을 기준으로 우선 프론트쪽을 구현해보겠다.
가장 먼저 할 것은 바로 vuetify 설치!
vuetify를 사용하기 위해 먼저 터미널에서 작업하려는 폴더로 이동 후, vuetify 를 깔아준다.
$cd vue-form
$vue add vuetify
뷰티파이 공식 사이트는 api 설명이 친절하게 잘되어있어서 여기꺼 보고 거의 따라하는 식으로 구현했다.
Navigation drawer component
The navigation drawer component contains internal navigation links for an application and can be permanently on-scre...
vuetifyjs.com
뷰티파이 API에서 가장 먼저 조회되는 것은 바로 Application의 구성(App.vue의 템플릿 부분에 구현될) 이다.
<v-app> <!--#1. 가장 상위 태그-->
<v-navigation-drawer app> <!--#2. 메뉴 보여줄 navigation bar-->
</v-navigation-drawer>
<v-app-bar app> <!-- #3. appbar 영역-->
</v-app-bar>
<v-main>
<v-container fluid>
<router-view></router-view> <!-- #4. router에서 맵핑해준 화면을 보여주는 영역-->
</v-container>
</v-main>
<v-footer app>
</v-footer>
</v-app>
Application은 이런식으로 구성이 되어야 한다.
1번부터 살펴보자.
#1. 가장 상위 태그
이 상위 태그는 <template> 태그 내에 상위 태그가 하나만 있어야 한다는 뜻이다.
예제에서는 보통 <div> 태그로 감싸줬지만, 뷰티파이에서는 <v-app>태그를 주로 사용하는 것 같다.
#2. 메뉴를 보여줄 Navigation drawer
navigation drawer는 이런 형태의 navigation menu를 말한다.
Navigation drawer에서 메뉴 및 아이콘을 맵핑해주기 위해서는 뷰 인트선스의 data에 items이라는 변수를 선언해주고, 이를 html 영역에서는 가져다 쓰는 방식으로 한다.
v-for 를 통해 items 변수를 화면에 렌더링해주고 아이콘은 item.icon, 타이틀은 item.title, url은 item.to를 맵핑해준다.
App.vue의 template 태그 내 navigation drawer 부분
-template
-v-app
-v-navigation-drawer
<v-navigation-drawer
v-model="drawer"
absolute
temporary
> <!--#1. 뷰티파이에서 제공해주는 v-navigation tag 사용-->
<v-list>
<v-list-item two-line>
<v-list-item-avatar>
<!--<img src="https://randomuser.me/api/portraits/women/81.jpg">-->
</v-list-item-avatar>
<v-list-item-content>윤가영</v-list-item-title>
<v-list-item-subtitle>개발자</v-list-item-subtitle>
</v-list-item-content>
</v-list-item>
</v-list>
<v-divider></v-divider>
<v-list dense> <!-- #2. v-list와 v-for를 사용하여 items를 리스트로 렌더링-->
<v-list-item
v-for="item in items"
:key="item.title"
link
:to="item.to" <!-- #3. 메뉴의 url은 스크립트에서 정의해준다 -->
>
<v-list-item-icon>
<v-icon>{{ item.icon }}</v-icon>
</v-list-item-icon>
<v-list-item-content>
<v-list-item-title>{{ item.title }}</v-list-item-title>
</v-list-item-content>
</v-list-item>
</v-list>
</v-navigation-drawer>
item에 관한 부분은 data에서 정의해주면 된다.
data: () => ({
items : [
/* 우선 어디로 이동할지 안정했으니 수강신청 화면으로 이동한다. */
{ title : '강사 등록' , icon : 'mdi-account' , to: '/enrolclasses'} ,
{ title : '회원 관리' , icon : 'mdi-account' , to:'/enrolclasses' } ,
{ title : '개발자 관리 화면' , icon : 'mdi-account' , to: '/enrolclasses' }
],
drawer : false
})
훗
#3. app-bar
나는 app-bar 영역 내에는 그냥 navigation drawer를 열어주는 버튼만 하나 넣어주는 식으로 코딩했다.
<v-app-bar-nav-icon @click="drawer = true"></v-app-bar-nav-icon>
그리고 뷰티파이 공식 문서 내 Application 구조에는 나와있지 않지만 화면의 하단에 아이콘을 클릭하면 특정화면으로 넘어갈 수 있도록,
bottom-navigation 영역을 만들어주었다. 아래 그림처럼!
저 아이콘과 url을 연결하기 위해서는 router를 사용해야 한다. router는 다음 챕터에서 작성하도록 하겠다.
우선 먼저 살펴보자면 vuetify에서 제공하는 v-bottom-navigation 태그는 아래처럼 사용했다.
<v-bottom-navigation v-model="value">
<v-btn value="home" @click="homeBtnClick">
<span>Home</span>
<v-icon>fas fa-home</v-icon>
</v-btn>
<v-btn value="userInfo" @click="userInfoBtnClick">
<span>myPage</span>
<v-icon>fas fa-user</v-icon>
</v-btn>
<v-btn value="notice" @click="noticeBtnClick">
<span>notice</span>
<v-icon>fas fa-bell</v-icon>
</v-btn>
</v-bottom-navigation>
그리고 해당 버튼에 따른 url 은 역시 뷰인스턴스의 methods 부분에서 구현해주면 된다.
// 1. App.vue의 script영역
methods: {
homeBtnClick : function () {
alert("회원권 화면으로 돌아갑니다.");
this.$router.push({name : 'index'});
},
userInfoBtnClick : function () {
this.$router.push({name : 'userInfo'});
},
noticeBtnClick : function () {
this.$router.push({name : 'notice'})
}
}
// 2. index.js --router file
import Vue from 'vue'
import Router from 'vue-router'
import EnrolClasses from '../components/EnrolClasses.vue'
import Mmbrship from '../components/Mmbrship.vue'
import UserInfo from '../components/UserInfo.vue'
import Notice from '../components/Notice.vue'
Vue.use(Router)
const createRouter = () => new Router({
mode: 'history',
routes: [
{
path : '/',
name : 'index',
component : Mmbrship
},
{
path : '/enrolclasses',
name : 'enrolclasses',
component : EnrolClasses
} ,
{
path : '/userInfo',
name : 'userInfo',
component : UserInfo
},
{
path : '/notice' ,
name : 'notice',
component : Notice
}
]
})
const router = createRouter()
export function resetRouter() {
const newRouter = createRouter()
router.matcher = newRouter.matcher // reset router
}
export default router
#4. router에서 맵핑해준 뷰객체를 보여주는 영역
말그대로 어디서 router에 정의된 url을 호출하는 경우,
호출된 뷰 객체를 저 영역에 뿌려준다.
'개인 프로젝트 > 예약 시스템 개발하기' 카테고리의 다른 글
예약 시스템 개발하기 06. EmbeddedId와 ConverterNotFoundException (0) | 2022.03.12 |
---|---|
예약 시스템 개발하기 05. HttpMediaTypeNotSupportedException (0) | 2022.03.12 |
예약 시스템 개발하기 04. JPA 쿼리 메소드와 JPQL , CharacterEncodingFilter (0) | 2022.03.06 |
예약 시스템 개발하기 03. axios 통신과 CORS 정책 (0) | 2022.02.02 |
예약 시스템 개발하기 02. Router (0) | 2022.01.31 |