티스토리 뷰
<template>
<v-container>
<v-content>
<p class="text-center display-3 my-4">메인페이지입니다.</p>
<v-row>
<v-col offset-sm="1" sm="10">
<!-- 제목을 입력받으면 sTitle 데이터와 바인딩해서 store에 저장 -->
<v-text-field label="제목" v-model="sTitle"></v-text-field>
</v-col>
</v-row>
<div class="text-center">
<v-btn large class="mt-5" color="purple" dark @click="fnSetTitle"
>확인</v-btn
>
</div>
</v-content>
</v-container>
</template>
<script>
export default {
//store에 있는 데이터를 가져옴
data() {
return {
sTitle: this.$store.getters.fnSetData,
};
},
//입력받은 제목을 store에 저장
methods: {
fnSetTitle() {
this.$store.commit("fnSetData", this.sTitle);
this.$router.push("/sub");
},
},
};
</script>
저번글에서는 뷰티파이의 개념과 뷰티파이의 기본적인 사용법에 대해 포스트하였습니다.
marshmello.tistory.com/50?category=1158454
이번글에서는 뷰티파이 기능으로 뷰의 라우터와 Vuex를 디자인해서 싱글 페이지 앱을 만드는 방법에 대해 알아보겠습니다.
1. Bottom Navigation
VSCode를 실행하여 bottom_nav.html 파일을 만듭니다.
v2.vuetifyjs.com/ko/getting-started/quick-start/
위 사이트에 가서 CDN을 이용하여 뷰티파이를 연결해줍니다.
bottom_nav.html 파일 소스를 아래와 같이 작성합니다.
<!DOCTYPE html>
<html>
<head>
<link href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900|Material+Icons" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/@mdi/font@5.x/css/materialdesignicons.min.css" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/vuetify@2.x/dist/vuetify.min.css" rel="stylesheet">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no, minimal-ui">
</head>
<body>
<div id="app">
<v-app>
<!-- 내용 영역에 선택된 메뉴명을 표시함. flexbox를 이용해서 가운데 정렬시킴 -->
<v-content>
<v-card height="100%" class="d-flex display-2 align-center justify-center">선택: {{ sSelect }}</v-card>
</v-content>
<!-- 하단 영역에 바닥 네비게이션 메뉴를 absolute로고정시켜 표시함 -->
<v-footer>
<!-- 선택된 메뉴는 sSelect 데이터를 연동시켜 바인딩함 -->
<v-bottom-navigation absolute v-model="sSelect" dark>
<!-- 아이콘 버튼 3개를 표시함 -->
<v-btn text value="자전거">
자전거
<v-icon>directions_bike</v-icon>
</v-btn>
<v-btn text value="지하철">
지하철
<v-icon>subway</v-icon>
</v-btn>
<v-btn text value="버스">
버스
<v-icon>directions_bus</v-icon>
</v-btn>
</v-bottom-navigation>
</v-footer>
</v-app>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.x/dist/vue.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vuetify@2.x/dist/vuetify.js"></script>
<script>
new Vue({
el: '#app',
vuetify: new Vuetify(),
data: {
sSelect: '자전거'
}
})
</script>
</body>
</html>
본문영역은 v-content, v-container를 담당합니다.
v-content는 앱바와 바닥글을 제외한 나머지 영역을 본문영역으로 확보해줍니다.
v-container는 반응형 웹 디자인을 고려해 화면 크기에 맞춰 여백을 자동으로 설정해줍니다.
v-footer안에 v-bottom-navigation를 사용해서 배치합니다. 스크롤에 고나계없이 하단에 항상 나타나게 하려면 absolute 속성을 설정합니다.
value 속성은 True 혹은 False의 값을 넣어 바닥 넵비게이션이 화면에 나타나거나 사라지게 할 수 있습니다. 버튼을 눌러 선택된 값을 v-model 디렉티브를 사용해 sSelect에 대입하도록 바인딩합니다.
bottom navigation 버튼에서 값을 가져오는 방법은 v-bottom-navigation에서 사용한 v-model="sSelect"에 달렸습니다. 이것은 사용자가 선택한 버튼과 sSelect 변수를 자동으로 바인딩합니다. 따라서 data 속성에 이변수를 연결하면 됩니다.
실행결과 화면
참고사이트
v2.vuetifyjs.com/ko/components/bottom-navigation/
2. Navigation drawer
탐색서랍은 앱바의 메뉴 아이콘을 누르면 나타나는 것으로, 링크를 클릭하면 해당 사이트로 이동하게 구성되어있습니다.
VSCode를 실행하여 navigation drawer.html 파일을 만듭니다.
vuetifyjs.com/en/features/icons/#font-awesome-5-icons
뷰티파이와 fontawsome을 연결해줍니다.
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no, minimal-ui">
<link href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900|Material+Icons" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/@mdi/font@3.x/css/materialdesignicons.min.css" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/vuetify@2.2.x/dist/vuetify.min.css" rel="stylesheet">
<!-- 폰트어썸 아이콘을 사용하기 위해 연결함 -->
<script defer src="https://use.fontawesome.com/releases/v5.0.8/js/all.js"></script>
</head>
<body>
<div id="app">
<v-app>
<!-- 상단영역에 툴바를 배치하고 좌측에 메뉴 아이콘 넣음 -->
<v-app-bar app color="primary" dark>
<!-- 메뉴 아이콘이 눌리면 클릭기능을 비활성화시킴 -->
<v-app-bar-nav-icon @click.stop="bDrawer = !bDrawer">
</v-app-bar-nav-icon>
<v-toolbar-title>Header입니다.</v-toolbar-title>
</v-app-bar>
<!-- bDrawer가 True이면 탐색 서랍 사용하도록 바인딩함 -->
<v-navigation-drawer absolute temporary v-model="bDrawer">
<!-- 안쪽에 툴바로 플랫 스타일로 메뉴 제목을 작성 -->
<v-toolbar flat height="70px">
<v-list>
<v-list-item>
<v-list-item-avatar>
<img src="https://randomuser.me/api/portraits/men/44.jpg">
</v-list-item-avatar>
<v-list-item-content>
<v-list-item-title class="title">홍길동</v-list-item-title>
<v-list-item-subtitle>로그인</v-list-item-subtitle>
</v-list-item-content>
</v-list-item>
</v-list>
</v-toolbar>
<v-divider></v-divider>
<!-- 제목 밑에 메뉴명을 목록으로 작성. 안쪽여백은 pt-3으로 설정 -->
<v-list class="pt-3">
<!-- 배열에 있는 데이터를 반복문으로 가져와 링크, 제목, 아이콘을 렌더링함 -->
<v-list-item v-for="item in aMenu_items" :key="item.title" :href="item.link">
<v-list-item-action>
<v-icon>{{ item.icon }}</v-icon>
</v-list-item-action>
<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>
</v-app>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.x/dist/vue.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vuetify@2.x/dist/vuetify.js"></script>
<script>
new Vue({
el: '#app',
vuetify: new Vuetify(),
data: {
// 버튼이 눌리면 비활성화되도록 하는 토글 변수
bDrawer: false,
// 배열로 메뉴의 제목, 아이콘, 링크를 준비
aMenu_items: [{
title: '스타벅스',
icon: 'fa-coffee',
link: 'http://www.starbucks.com'
},
{
title: '애플',
icon: 'mdi-apple',
link: 'http://www.apple.com'
},
{
title: '페이스북',
icon: 'mdi-facebook-box',
link: 'http://www.facebook.com'
}
]
}
})
</script>
</body>
</html>
v-app-bar-nav-icon 메뉴아이콘을 눌렀다가 뗼때마다 @click.stop으로 이벤트가 발생하면 bDrawer변수값이 true 또는 false로 번갈아 변경됩니다. 이 변수값을 이용해서 탐색 서랍의 표시 여부를 결정하는 것입니다.
탐색서랍은 v-navigation-drawer 를 이용합니다. absolute 속성은 정확히 메뉴 아이콘 위치부터 서랍이 펼쳐지듯이 나타나게 됩니다. v-model 디렉티브는 탐색 서랍이 나타나거나 사라지는 타이밍을 bDrawer 변수값과 바인딩하여 결정합니다.
리스트간의 항목 구분선은 v-divider을 사용합니다.
실행결과 화면
3. SPA 만들기
Vue-CLI를 통해서 생성된 템플릿을 사용할 수 있어야합니다. 뷰티파이에서 제공하는 Vue-CLI템플릿을 활용해 메인 페이지와 서브 페이지로 이동하는 라우터 기능을 구현해 보겠습니다.
VSCode에서 터미널창을 열어 프로젝트를 만듭니다.
please pick a preset -> Manually select featres 선택
신규 프로젝트 템플릿을 기본으로 할지 아니면 사용자 정의로 할지 결정
check the features needs for your project -> [Router]만 선택 나머지 모두 선택해제
이 메뉴로 Babel, TypeScript, PWA등의 다양한 기능을 템플릿에 담을 수 있음 (스페이스바로 선택/해제)
User history model for router? 기본값 Y 선택( 주소 표시줄에 나타나는 #을 제거해줌)
라우터에서 히스토리모드의 사용여부 결정
where do you profer placing config for..->기본값 그대로 config 파일 선택
설정값을 config 파일과 package.json 파일 중에 어디에 저장할지 결정
save this as a preset for future projects?(Y/N) -> 기본값 N 선택
지금까지 선택한 기능을 다음 프로젝트에도 사용할지 여부
SPA 설치 및 자세한 설명은
에 6번 7번에 자세하게 설명되어있습니다.
vue create 프로젝트명
cd .\프로젝트명\
위와 같이 프로젝트를 생성한 후 프로젝트로 이동합니다.
아래의 명령어로 뷰티파이 플러그인을 추가하여줍니다.
vue add vuetify
뷰티파이 플러그인을 추가할때 3가지 옵션이 나오면 Default를 선택합니다.
뷰티파이 3가지 옵션은 다음과같습니다.
옵션 | 설명 |
Default(recommended) | 자동으로 생성된 *.vue 파일에 기본 템플릿 디자인 포함 |
Prototype(rapid development) | 자동으로 생성된 *.vue 파일은 아주 간략하게 작성 |
Configure(advanced) | *.vue,테마파일,CSS,아이콘,로컬언어 등은 직접 선택가능 |
VSCode 메뉴 파일 -> 폴더 열기로 위에서 만든 프로젝트를 열어줍니다.
파일을 열면 아래의 구조와 같이 생성된 것을 볼 수 있습니다.
웹팩 모듈을 설치하고 생성된 프로젝트가 제대로 생성되었는지 실행해봅니다.
(자세한 웹팩에 대한 설치 방법 안내는 marshmello.tistory.com/49 7번 확인)
터미널을 열어 다음과 같은 명령어를 입력합니다.
npm install
npm run serve
터미널에 출력된 http://localhost:8080/ 을 ctrl 키와 함께 눌러 실행해봅니다.
위와같이 뷰티파이 플러그인이 정상 설치 된것을 확인 할 수 있습니다.
다시 VSCode로 돌아와 프로젝트의 src/App.vue 파일을 아래와 같이 수정합니다.
<template>
<v-app>
<!-- 앱바 테마를 primary 파랑색으로 설정 -->
<v-app-bar app color="primary" dark>
<v-app-bar-nav-icon></v-app-bar-nav-icon>
<v-toolbar-title>Page title</v-toolbar-title>
<v-spacer></v-spacer>
<v-btn icon>
<v-icon>mdi-dots-vertical</v-icon>
</v-btn>
</v-app-bar>
<!-- 내용영역에 라우터 페이지 렌더링 -->
<v-content>
<!-- 페이지 장면 전환 효과 넣기 -->
<v-slide-x-transition mode="out-in">
<router-view></router-view>
</v-slide-x-transition>
</v-content>
<!-- 바닥글의 테마를 secondary 짙은 회색으로 설정 -->
<v-footer color="secondary" fixed dark>
<div class="mx-auto">푸터 내용</div>
</v-footer>
</v-app>
</template>
v2.vuetifyjs.com/ko/components/app-bars/
위 사이트 참고
v-slide-x-transition 엘리먼트로 장면 전환 효과를 줄 수 있습니다. 장면 전환 효과가 일어나는 대상은 이 엘리먼트의 값으로 지정된 router-view가 대상이됩니다.
뷰티파이에어 제공하는 장면 전환 엘리먼트의 종류는 다음과 같습니다.
종류 | 효과 |
v-slide-x-transition | 좌우 방향으로 짧게 전환 |
v-slide-y-transition | 위 아래 방향으로 짧게 전환 |
v-fade-transition | 사라졌다가 나타나게 됨 |
v-scale-transition | 작아졌다 커지게 함 |
mode는 방향을 결정하는데 out-in 을 주면 바깥에서 안쪽으로 변환합니다.
mode 어트리뷰트의 종류는
in-out 안에서 바깥으로 나타남 out-in 바깥에서 안으로 나타남 으로 정리할 수 있습니다.
v-footer에 fixed로 하면 스크롤에 영향을 받지 않고 고정적으로 바닥글을 볼 수 있습니다. mx-auto로 설정하여 센터로 가도록 설정하였습니다.
메인화면을 만들기 위해 main.vue 파일을 src/component안에 생성합니다.
<template>
<v-container>
<p class="display-1 my-4">메인페이지입니다.</p>
<v-divider></v-divider>
<p class="display-4 my-4">메인페이지입니다.</p>
<div class="text-center">
<v-btn icon color="green" fab large class="mt-5" dark to="/sub">
<v-icon>mdi-arrow-right</v-icon>
</v-btn>
</div>
</v-container>
</template>
메인페이지에서 연결되는 서브페이지를 만들어보겠습니다. sub.vue 파일을 src/components 폴더에 생성합니다.
<template>
<v-container>
<p class="display-1 my-4">서브 페이지입니다.</p>
<v-divider></v-divider>
<p class="display-4 my-4">서브 페이지입니다.</p>
<div class="text-center">
<v-btn icon color="teal" fab large class="mt-5" dark to="/main">
<v-icon>mdi-arrow-right</v-icon>
</v-btn>
</div>
</v-container>
</template>
마지막으로 링크를 연결할 src/router/index.js 파일을 아래와 같이 수정합니다.
import Vue from 'vue'
import VueRouter from 'vue-router'
import sub from "@/components/Sub";
import main from "@/components/Main";
Vue.use(VueRouter)
const routes = [
{
path: '/',
name: 'Home',
component: main
},
{
path: '/main',
name: 'main',
component: main
},
{
path: '/sub',
name: 'sub',
component: sub
}
]
const router = new VueRouter({
mode: 'history',
base: process.env.BASE_URL,
routes
})
export default router
vue-router 코어를 읽어봐서 Router 객체 이름으로 사용할 수 있도록 준비합니다.
다음으로 Main.vue와 Sub.vue 라는 컴포넌트 모듈 2개를 가져와 각각 main, sub 객체 이름으로 사용할 수 있도록 준비했습니다.
소스처럼 라우터를 생성할때 mode에 history 옵션을 지정하면 브라우저의 주소 줄에 #이 제거됩니다. 이 설정은 프로젝트를 생성할 때 Use history mode for router? 라는 질문에 Y 를 선택했기 때문에 자동으로 추가된 것입니다.
VScode에서 터미널을 열어 웹팩을 실행합니다.
npm run serve
초록색 화살표를 눌러 정상적으로 화면이 이동하는지 확인해봅니다.
4. SPA 만들기 - Vuex로 상탯값 관리 이용
VSCode을 열어 터미널로 프로젝트를 생성합니다.
vue create 프로젝트명
please pick a preset -> Manually select featres 선택
신규 프로젝트 템플릿을 기본으로 할지 아니면 사용자 정의로 할지 결정
check the features needs for your project ->[Vuex]와 [Router]만 선택 나머지 모두 선택해제
이 메뉴로 Babel, TypeScript, PWA등의 다양한 기능을 템플릿에 담을 수 있음 (스페이스바로 선택/해제)
User history model for router? 기본값 Y 선택( 주소 표시줄에 나타나는 #을 제거해줌)
라우터에서 히스토리모드의 사용여부 결정
where do you profer placing config for..->기본값 그대로 config 파일 선택
설정값을 config 파일과 package.json 파일 중에 어디에 저장할지 결정
save this as a preset for future projects?(Y/N) -> 기본값 N 선택
지금까지 선택한 기능을 다음 프로젝트에도 사용할지 여부
아래의 명령어로 뷰티파이 플러그인을 추가하여줍니다.
vue add vuetify
뷰티파이 플러그인을 추가할때 3가지 옵션이 나오면 Default를 선택합니다.
VSCode를 열어 생성한 프로젝트를 파일 -> 폴더열기로 엽니다.
정상적으로 설치가 되었는지 확인하기 위하여 프로젝트에 웹팩을 설치하고 실행해 보겠습니다.
터미널을 열어 다음과 같은 명령어를 입력합니다.
npm install
npm run serve
터미널에 출력된 http://localhost:8080/ 을 ctrl 키와 함께 눌러 실행해봅니다.
위 화면이 보인다면 정상적으로 프로젝트가 설치된것을 확인 할 수 있습니다.
이제 프로젝트의 src/App.vue 파일을 열어 다음과 같이 수정합니다.
<template>
<v-app>
<!-- 앱바 테마를 primary 파랑색으로 설정 -->
<v-app-bar app color="primary" dark>
<v-app-bar-nav-icon></v-app-bar-nav-icon>
<v-toolbar-title>멀티페이지</v-toolbar-title>
<v-spacer></v-spacer>
<v-btn icon>
<v-icon>mdi-dots-vertical</v-icon>
</v-btn>
</v-app-bar>
<!-- 내용영역에 라우터 페이지 렌더링 -->
<v-content>
<!-- 페이지 장면 전환 효과 넣기 -->
<v-slide-x-transition mode="out-in">
<router-view></router-view>
</v-slide-x-transition>
</v-content>
<!-- 바닥글의 테마를 secondary 짙은 회색으로 설정 -->
<v-footer color="secondary" fixed dark>
<div class="mx-auto">푸터 내용</div>
</v-footer>
</v-app>
</template>
src/store/index.js를 열어줍니다.
store파일은 상탯값을 저장하는 Vuex 스토어입니다. 코드를 아래와 같이 수정합니다.
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
//Vuex의 store 중앙에 state, mutations(setter),getter 정의
export default new Vuex.Store({
//sTitle값을 상태값으로 정의
state: {
sTitle:''
},
//mutations는 getters와 대칭되는 setters 역할 설정
mutations: {
fnSetData : function(state,payload){
return state.sTitle = payload
}
},
getters: {
//store의 상태값 변환
fnSetData : function(state){
return state.sTitle;
}
},
actions: {
},
modules: {
}
})
Vuex 객체를 사용하려면 Vuex의 Store()함수로 필요한 속성을 정의하면 됩니다. state 속성에 제목을 저장할 목적으로 sTitle이라는 변수를 정의합니다.
mutations 속성은 스토어에 저장하는 setters 역할을 수행해야합니다. fnSetData() 를 정의하여 외부에서 이 함수를 통해 값을 저장하도록 합니다. 외부에서 전달받은 매개변수 payload값을 함께 전달받은 state.sTitle에 저장합니다.
getters는 fnSetData()를 통해 외부에서 접근 할 수 있도록 state.sTitle값을 반환해줍니다.
이어서 메인페이지를 작성해봅니다. src/components/ 폴더에 main_page.vue 를 생성합니다.
<template>
<v-container>
<v-content>
<p class="text-center display-3 my-4">메인페이지입니다.</p>
<v-row>
<v-col offset-sm="1" sm="10">
<!-- 제목을 입력받으면 sTitle 데이터와 바인딩해서 store에 저장 -->
<v-text-field label="제목" v-model="sTitle"></v-text-field>
</v-col>
</v-row>
<div class="text-center">
<v-btn large class="mt-5" color="purple" dark @click="fnSetTitle"
>확인</v-btn
>
</div>
</v-content>
</v-container>
</template>
<script>
export default {
//store에 있는 데이터를 가져옴
data() {
return {
sTitle: this.$store.getters.fnSetData,
};
},
//입력받은 제목을 store에 저장
methods: {
fnSetTitle() {
this.$store.commit("fnSetData", this.sTitle);
this.$router.push("/sub");
},
},
};
</script>
v2.vuetifyjs.com/ko/components/text-fields/
참조
@click 이벤트가 발생하면 fnSetTitle() 함수를 실행합니다. 그리고 /sub 경로를 to 어트리뷰트에 지정하여 서브페이지로 이동하도록 라우팅합니다.
양방향 데이터 바인딩(v-model)이므로 입력할떄마다 sTitle 값이 변경됩니다. sTtile 변수의 초깃값은 Vuex의 스토어에 읽어 와야 하므로 뷰 인스턴스에 선언된 store 객체 변수에 접근하기 위해서 this.$store.를 사용합니다. 그리고 스토어에 있는 getters 속성의 fnGetData() 함수를 실행해서 읽은 값을 sTitle 변수의 초기값으로 설정합니다.
여기서 $store에 달러 기호를 사용합니다. 뷰 인스턴스의 멤버에 접근하려면 반드시 $를 사용해야합니다.
사용자가 확인 버튼을 클릭하면 Vuex 스토어에 저장되어야 합니다. 그래서 commit() 함수를 사용해 fnSetData() 함수에 접근하여 매개변수로 sTitle값을 전달합니다. this는 현제 페이지의 data 속성에 접근하기 위해 사용한 것입니다.
그리고 $를 사용하면 뷰 객체의 속성에 직접 접근 할 수 있습니다. 마지막으로 this.$router.push("/sub"); 는 라우터를 통해 서브페이지로 이동합니다.
서브페이지를 src/components/ 폴더에 sub_page.vue 로 생성합니다.
<template>
<v-container>
<v-content>
<p class="text-center display-1 my-4">서브 페이지입니다.</p>
<v-divider></v-divider>
<!--store에 있는 sTitle값을 가져와 표시 -->
<div class="text-center display-3 my-4">{{ sTitle }}</div>
<div class="text-center">
<v-btn color="teal" fab large class="mt-5" dark to="/main">
<v-icon>mdi-replay</v-icon>
</v-btn>
</div>
</v-content>
</v-container>
</template>
<script>
export default {
//store에 있는 fnSetData() 함수를 호출하여 sTitle를 가져옴
data() {
return {
sTitle: this.$store.getters.fnSetData,
};
},
};
</script>
메인페이지에서 입력한 값을 스토어에서 가져와 표시하기 위해 {{ sTitle }} 머스태시로 sTitle 변수값을 바인딩하여 표시합니다.
페이지간의 링크를 to 어트리뷰트에 라우터 정보로 지정하면 페이지끼리 이동할 수 있습니다.
단 to 어트리뷰트를 사용하려면 Vuex 스토어에 값이 저장되지 않으므로 상태값을 관리할 필요가 없는 간단한 이동에만 활용해야 합니다.
sTtile 변수는 초기값으로 Vuex 스토어의 fnGetData() 함수로 접근해 값을 읽어서 저장합니다. 이 값이 바로 메인 페이지에서 작성하고 확인을 눌렀을때 저장한 값입니다.
src/router/index.js 파일을 열어 다음과 같이 수정합니다.
import Vue from 'vue'
import VueRouter from 'vue-router'
import main_page from '@/components/main_page';
import sub_page from '@/components/sub_page';
Vue.use(VueRouter)
const routes = [
{
path: '/',
name: 'home',
component: main_page
},
{
path: '/main',
name: 'main_page',
component: main_page
},
{
path: '/sub',
name: 'sub_page',
component: sub_page
}
]
const router = new VueRouter({
mode: 'history',
base: process.env.BASE_URL,
routes
})
export default router
웹팩을 실행해봅니다.
vue run serve
입력란에 값을 입력 후 확인 버튼을 누릅니다.
뷰티파이 심화편을 알아봤습니다.
다음편에는 뷰 프레임워크를 공부해보겠습니다.
수고하셨습니다.
'WEB' 카테고리의 다른 글
aws ec2 서버와 카페24 도메인 연결 (0) | 2020.12.22 |
---|---|
[PWA] 앱 배포하기 (0) | 2020.11.17 |
[PWA] 뷰티파이 기초편 (1) | 2020.10.28 |
[PWA] 뷰 vue.js 고급 기능 (0) | 2020.10.26 |
[PWA] 뷰 vue.js 입문 (1) | 2020.10.26 |
- Total
- Today
- Yesterday