vue
프로젝트 초기 생성 방법은
다음을 참조 : https://macaronics.net/m04/vue/view/2048
소스 :
https://github.com/braverokmc79/vue-todo
1. 파이어 베이스 DB와 연동하지 않은 프로젝트
최종 산출물

vuetify 사용법
예를 들엇 v-card 를 찾아서 적용하고 싶다면 검색을 한다.

vuetifyjs 에서 v-card 검색 후


이와 같은 방법으로
v-card,
v-row
cols,
v-list-item
v-text-field
등의 검색을 하고 예시로 사용한 템플릿 소스를 보면서 적용한다.
https://vuetifyjs.com/en/components/checkboxes/
App.vue
<template>
<v-app>
<v-card>
<v-app-bar dark color="pink">
<v-app-bar-nav-icon></v-app-bar-nav-icon>
<v-toolbar-title>To-Do 리스트</v-toolbar-title>
</v-app-bar>
<v-main>
<v-container>
<v-row my-5>
<v-col cols="8" offset="1" >
<!-- 실행되자마자 입력 포커스를 가지도록 autofocus 설절 -->
<v-text-field label="할 일" required autofocus v-model="sTodoTitle" >
</v-text-field>
</v-col>
<v-col cols="2">
<v-btn fab class="mx-2" dark color="pink" @click="fnsubmitTodo()" >
<v-icon dark>mdi-plus</v-icon>
</v-btn>
</v-col>
</v-row>
<v-row>
<v-col cols="12" >
<v-list two-line v-for="(item, i) in items" :key="i">
<v-card flat color="grey lighten-3" v-if="!item.b_edit">
<v-list-item-group>
<v-list-item class="py-2">
<template >
<v-list-item-action>
<v-checkbox v-model="item.b_completed" @change="fnCheckboxChange(item.key)"></v-checkbox>
</v-list-item-action>
<v-list-item-content>
<v-list-item-title v-text="item.todo_title" :class="{'style_completed':item.b_completed}"></v-list-item-title>
<v-list-item-subtitle class="mt-2">
<v-icon class="pointer" @click="fnSeEditTodo(item.key)">create</v-icon>
<v-icon class="pointer" @click="fnRemoveTodo(item.key)">delete</v-icon>
</v-list-item-subtitle>
</v-list-item-content>
</template>
</v-list-item>
</v-list-item-group>
</v-card>
<v-card v-else dark>
<v-list-item-group>
<v-list-item class="py-2">
<template v-slot:default="{ active }">
<v-list-item-action>
<v-checkbox v-model="item.b_completed" @change="fnCheckboxChange(item.key)"></v-checkbox>
</v-list-item-action>
<v-list-item-content >
<v-col cols="11" >
<v-text-field v-model="item.todo_title" color="blue darken-2" autofocus clearable
required
></v-text-field>
</v-col>
<v-col cols="1" >
<v-list-item-subtitle class="mt-2">
<v-icon class="pointer" @click="fnSaveEditTodo(item.key)">save</v-icon>
<v-icon class="pointer" @click="fnCancelEdit(item.key)">cancel</v-icon>
</v-list-item-subtitle>
</v-col>
</v-list-item-content>
</template>
</v-list-item>
</v-list-item-group>
</v-card>
</v-list>
</v-col>
</v-row>
</v-container>
</v-main>
</v-card>
</v-app>
</template>
<script>
export default {
name: 'App',
data () {
return {
sTodoTitle:"",
selectedItem: 1,
items: [
{key:1, todo_title: 'Real-Time' , b_edit:false, b_completed:false},
{key:2, todo_title: 'Audience' , b_edit:false , b_completed:false},
{key:3, todo_title: 'Conversions' , b_edit:false, b_completed:false},
{key:4, todo_title: 'Conversions' , b_edit:true, b_completed:false},
],
checkbox: true,
settings: [],
}
},
methods: {
//할일 추가 폼 버튼 클릭시
fnsubmitTodo(){
if(!this.sTodoTitle){
window.alert("할일을 입력해 주세요.");
return;
}
const data= {
key:new Date().getTime(),
todo_title:this.sTodoTitle ,
b_edit:false,
b_completed:false
}
this.items.push(data);
this.sTodoTitle="";
},
//수정 버튼 클릭시
fnSeEditTodo(key){
this.items.map(item=>{
if(item.key===key){
item.b_edit=true
}
});
},
//수정후 저저장 버튼 클릭시
fnSaveEditTodo(key){
this.items.map(item=>{
if(item.key===key){
item.b_edit=false
}
});
},
//취소버튼 클릭시
fnCancelEdit(key){
this.items.map(item=>{
if(item.key===key){
item.b_edit=false
}
});
},
//삭제 버튼 클릭시
fnRemoveTodo(key){
const result=this.items.filter((item)=>(item.key!==key));
this.items=result;
},
fnCheckboxChange(key){
}
},
computed: {
},
};
</script>
<style>
.pointer {
/* 마우스포인터를 손모양으로 변경 */
cursor: pointer;
}
.style_completed {
/* 할 일의 제목을 취소선으로 변경 */
text-decoration: line-through;
}
</style>
2. vue 파이어 베이스 실시간 데이터 베이스 3분안에 연동 ,
파이어 베이스 DB 준비하기
파이어베이스 공식 문서 참조
https://firebase.google.com/docs/database/web/start?hl=ko
파이어베이스 실시간 데이터 베이스 설정
다음과 같이 데이터 베이스 만들기를 클릭한다

데이터 베이스 지역 설정

테스트모드에서 시작 설정

위와 같이 하면 파이어베이스 실시간 데이터 베이스 설정 완료 된 것이다.
다음을 통해 databaseURL 값을 알아내야 한다.

다음 톱니바퀴 버튼을 클릭후 맨 아래로 내리면

파이어베이스 SDK 설정 및 구성 값을 알아 낼 수 있다.

src/datasources/firebase.js 을 생성후 다음과 같이 작성
// 파이어베이스 앱 객체 모듈 가져오기
import firebase from 'firebase/compat/app'
// 파이어베이스 패키지 모듈 가져오기
import 'firebase/compat/database';
// 파이어베이스 DB를 초기화하고 연결
const oDB = firebase.initializeApp({
// 파이어베이스 콘솔에서 복사하여 붙여넣기
//databaseURL: "https://pwa-to-do.firebaseio.com",
databaseURL: "https://pwa-to-do-33db2.firebaseio.com",
}).database();
// 파이어베이스 DB객체 중에서 todos 항목을 다른 곳에서 사용하도록 공개
export const oTodosinDB = oDB.ref('todos');
src/main.js 에서 다음 과 같이 수정한다.
import Vue from "vue";
import App from "./App.vue";
import "./registerServiceWorker";
import vuetify from "./plugins/vuetify";
//뷰파이어 노드 모듈 가져와서 Vue 에 연결
import { rtdbPlugin } from "vuefire";
Vue.use(rtdbPlugin);
Vue.config.productionTip = false;
new Vue({
vuetify,
render: (h) => h(App),
}).$mount("#app");
뷰파이어 연결
뷰파이어를 사용하면 파이어베이스의 RTDB(realtime database) 와 파이어스토어 (클라우드 스토어 ) 등 두가지 DB 형식을 뷰 애플리케이션과 연결할 수 있도록 돕는
플러그인을 제공한다.
여기서는 RTDB 를 사용할 것이므로 rtdbplugin 을 모듈을 가져와서 뷰어 연결한다.
oTodosinDB는 루트 노드이고 child(pKey) 를 사용하면 원하는 자식 노드를 바로 선택할 수있다.

1) 파이어베이스 DB 가져오기
//파이어베이스 DB 가져옴
import { oTodosinDB } from './datasources/firebase';
2) 목록 불러오기
data () {
return {
oTodos:[], //할일 데이터 목록 저장 변수
sTodoTitle:"", //할일 제목 저장 문자열 변수
// items: [
// {key:1, todo_title: 'Real-Time' , b_edit:false, b_completed:false},
// {key:2, todo_title: 'Audience' , b_edit:false , b_completed:false},
// {key:3, todo_title: 'Conversions' , b_edit:false, b_completed:false},
// {key:4, todo_title: 'Conversions' , b_edit:true, b_completed:false},
// ],
}
},
//파이어베이스를 쉽게 사용하도록 oTodos 변수로 변경
firebase:{
oTodos:oTodosinDB
},
3)등록하기
//할일 추가 폼 버튼 클릭시
fnsubmitTodo(){
if(!this.sTodoTitle){
window.alert("할일을 입력해 주세요.");
return;
}
//할일 제목 , 완료 수정 모드 상탯값을 파이어베이스 DB 에 저장
oTodosinDB.push({
todo_title: this.sTodoTitle,
b_completed: false,
b_edit: false
});
this.sTodoTitle="";
},
4) 수정하기
//수정 - 수정후 저저장 버튼 클릭시
fnSaveEditTodo(pItem){
const sKey=pItem['.key']
oTodosinDB.child(sKey).set({
todo_title:pItem.todo_title,
b_completed:pItem.b_completed,
b_edit:false
});
},
5)삭제하기
//삭제 - 삭제 버튼 클릭시
fnRemoveTodo(key){
//전달된 할일 DB 에서 제거
oTodosinDB.child(key).remove();
},
전체 코드
App.vue
<template>
<v-app>
<v-card>
<v-app-bar dark color="pink">
<v-app-bar-nav-icon></v-app-bar-nav-icon>
<v-toolbar-title>To-Do 리스트</v-toolbar-title>
</v-app-bar>
<v-main>
<v-container>
<v-row my-5>
<v-col cols="8" offset="1" >
<!-- 실행되자마자 입력 포커스를 가지도록 autofocus 설절 -->
<v-text-field label="할 일" required autofocus v-model="sTodoTitle" >
</v-text-field>
</v-col>
<v-col cols="2">
<v-btn fab class="mx-2" dark color="pink" @click="fnsubmitTodo()" >
<v-icon dark>mdi-plus</v-icon>
</v-btn>
</v-col>
</v-row>
<v-row>
<v-col cols="12" >
<v-list two-line v-for="(item, i) in oTodos" :key="i">
<v-card flat color="grey lighten-3" v-if="!item.b_edit">
<v-list-item-group>
<v-list-item class="py-2">
<template >
<v-list-item-action>
<v-checkbox v-model="item.b_completed" @change="fnCheckboxChange(item)"></v-checkbox>
</v-list-item-action>
<v-list-item-content>
<v-list-item-title v-text="item.todo_title" :class="{'style_completed':item.b_completed}"></v-list-item-title>
<v-list-item-subtitle class="mt-2">
<v-icon class="pointer" @click="fnSetEditTodo(item['.key'])">create</v-icon>
<v-icon class="pointer" @click="fnRemoveTodo(item['.key'])">delete</v-icon>
</v-list-item-subtitle>
</v-list-item-content>
</template>
</v-list-item>
</v-list-item-group>
</v-card>
<v-card v-else dark>
<v-list-item-group>
<v-list-item class="py-2">
<template v-slot:default="{ active }">
<v-list-item-action>
<v-checkbox v-model="item.b_completed" @change="fnCheckboxChange(item)"></v-checkbox>
</v-list-item-action>
<v-list-item-content >
<v-col cols="11" >
<v-text-field v-model="item.todo_title" color="blue darken-2" autofocus clearable
required
></v-text-field>
</v-col>
<v-col cols="1" >
<v-list-item-subtitle class="mt-2">
<v-icon class="pointer" @click="fnSaveEditTodo(item)">save</v-icon>
<v-icon class="pointer" @click="fnCancelEdit(item['.key'])">cancel</v-icon>
</v-list-item-subtitle>
</v-col>
</v-list-item-content>
</template>
</v-list-item>
</v-list-item-group>
</v-card>
</v-list>
</v-col>
</v-row>
</v-container>
</v-main>
</v-card>
</v-app>
</template>
<script>
//파이어베이스 DB 가져옴
import { oTodosinDB } from './datasources/firebase';
console.log(" oTodosinDB : " ,oTodosinDB);
export default {
name: 'App',
data () {
return {
oTodos:[], //할일 데이터 목록 저장 변수
sTodoTitle:"", //할일 제목 저장 문자열 변수
// items: [
// {key:1, todo_title: 'Real-Time' , b_edit:false, b_completed:false},
// {key:2, todo_title: 'Audience' , b_edit:false , b_completed:false},
// {key:3, todo_title: 'Conversions' , b_edit:false, b_completed:false},
// {key:4, todo_title: 'Conversions' , b_edit:true, b_completed:false},
// ],
}
},
//파이어베이스를 쉽게 사용하도록 oTodos 변수로 변경
firebase:{
oTodos:oTodosinDB
},
methods: {
//할일 추가 폼 버튼 클릭시
fnsubmitTodo(){
if(!this.sTodoTitle){
window.alert("할일을 입력해 주세요.");
return;
}
// const data= {
// key:new Date().getTime(),
// todo_title:this.sTodoTitle ,
// b_edit:false,
// b_completed:false
// }
// this.items.push(data);
//할일 제목 , 완료 수정 모드 상탯값을 파이어베이스 DB 에 저장
oTodosinDB.push({
todo_title: this.sTodoTitle,
b_completed: false,
b_edit: false
});
this.sTodoTitle="";
},
//수정 버튼 클릭시
fnSetEditTodo(key){
// this.items.map(item=>{
// if(item['.key']===key){
// item.b_edit=true
// }
// });
oTodosinDB.child(key).update({
b_edit:true
})
},
//수정 - 수정후 저저장 버튼 클릭시
fnSaveEditTodo(pItem){
// this.items.map(item=>{
// if(item['.key']===key){
// item.b_edit=false
// }
// });
const sKey=pItem['.key']
oTodosinDB.child(sKey).set({
todo_title:pItem.todo_title,
b_completed:pItem.b_completed,
b_edit:false
});
},
//취소버튼 클릭시
fnCancelEdit(key){
// this.items.map(item=>{
// if(item['.key']===key){
// item.b_edit=false
// }
// });
oTodosinDB.child(key).update({
b_edit:false
})
},
//삭제 - 삭제 버튼 클릭시
fnRemoveTodo(key){
// const result=this.items.filter((item)=>(item['.key']!==key));
// this.items=result;
//전달된 할일 DB 에서 제거
oTodosinDB.child(key).remove();
},
//체크박스 선택 되면 DB 에 b_completed 변경값 저장
fnCheckboxChange(pItem){
const sKey =pItem['.key']
oTodosinDB.child(sKey).update({
b_completed:pItem.b_completed
})
}
},
mounted() {
document.title = 'Todo 할일'
}
};
</script>
<style>
.pointer {
/* 마우스포인터를 손모양으로 변경 */
cursor: pointer;
}
.style_completed {
/* 할 일의 제목을 취소선으로 변경 */
text-decoration: line-through;
}
</style>
수정모드에서 set() 함수와 update() 함수 차이
수정 모드에서 수정한 내용을 저장하려면 update() 함수가 아니라 set() 함수를 사용한다.
그 이유는 set() 함수는 update() 함수와 달리 하위 노드도 모두 영향을 주는 , 좀 더 큰 수정 기능이기 때문이다.
//수정 - 수정후 저저장 버튼 클릭시
fnSaveEditTodo(pItem){
const sKey=pItem['.key']
oTodosinDB.child(sKey).set({
todo_title:pItem.todo_title,
b_completed:pItem.b_completed,
b_edit:false
});
},
//취소버튼 클릭시
fnCancelEdit(key){
oTodosinDB.child(key).update({
b_edit:false
})
},















댓글 ( 4)
댓글 남기기