티스토리 뷰
<template>
<TodoHeader :appTitle="appTitle"></TodoHeader>
<TodoInput :todoItems="todoItems" @add="addTodo"></TodoInput>
<TodoList :todoItems="todoItems" @remove="removeTodo"></TodoList>
</template>
<script>
import TodoHeader from '@/components/TodoHeader.vue'; //vim
import TodoInput from '@/components/TodoInput.vue';
import TodoList from '@/components/TodoList.vue';
import { onBeforeMount, ref } from 'vue';
export default {
components: {
TodoHeader,
TodoInput,
TodoList
},
setup() {
//data
const todoItems = ref([]);
//methods
function fetchTodos() {
const result = [];
for(let i = 0; i < localStorage.length; i++) {
const todoItem = localStorage.key(i);
result.push(todoItem);
}
return result;
}
//라이프 사이클 api가 적용된 구간
//todoItems.value = fetchTodos();
//화면이 그려지기 전에 동작
onBeforeMount(() =>{
todoItems.value = fetchTodos();
})
function addTodo(todo) {
todoItems.value.push(todo);
}
return {todoItems, addTodo}
},
methods:{
removeTodo(index) {
this.todoItems.splice(index, 1);
}
}
,
data() {
return{
appTitle: '할일앱'
}
}
}
</script>
<style lang="scss" scoped>
</style>
위를 보면 소스가 많이 더럽지 않지만, setup안은 실무레벨에서는 엄청나게 길어 질 것으로 보인다.
이때에 커스텀 컴포넌트를 사용한다.
/hooks/useTodo.js
import { onBeforeMount, ref } from "vue";
function useTodo() {
const todoItems = ref([]);
//methods
function fetchTodos() {
const result = [];
for(let i = 0; i < localStorage.length; i++) {
const todoItem = localStorage.key(i);
result.push(todoItem);
}
return result;
}
function addTodo(todo) {
todoItems.value.push(todo);
}
//화면이 그려지기 전에 동작
onBeforeMount(() =>{
todoItems.value = fetchTodos();
})
return {todoItems, fetchTodos, addTodo }
}
export {useTodo}
//app.vue
import { useTodo } from './hooks/useTodo';
export default {
setup() {
const {todoItems,addTodo} = useTodo();
return {todoItems, addTodo}
},
useTodo.js에서 정의한 data와 methods를 다른 뷰에서 불러와 사용할 수 있다.
주의점이 있다.
//화면이 그려지기 전에 동작
onBeforeMount(() =>{
todoItems.value = fetchTodos();
})
위처럼 data, methods가 아닌 형태의 코드는 커스텀컴포넌트(js에 따로 뺴는경우)에 있다보면 확인이 어렵다. 이런 코드는 사용하는 .vue 파일에 두는게 옳다.
'dev > vue3' 카테고리의 다른 글
watch란? (0) | 2025.01.25 |
---|---|
Lifecycle API 사용하기, mounted (0) | 2025.01.25 |
computed API란? (0) | 2025.01.25 |
composition API에서는 왜 setup에서 .value로 접근해야 할까? (0) | 2025.01.25 |
Composition API란 무엇인가? (0) | 2025.01.22 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 인터셉터
- 백엔드 개발자 역량
- react실행
- reject
- hypertexttransferprotocol
- 예외처리
- React
- BindingResult
- 컨트
- jpa api
- 향해플러스
- JPA
- Java
- 향해플러스백엔드
- 향해99
- HTTP
- Intercepter
- exception
- 로그인
- rejectValue
- thymleaf
- filter
- SpringBoot
- 백엔드 개발자 공부
- ArgumentResolver
- 항해99
- 항해플러스
- 스프링공부
- 리터럴
- 스프링부트
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
글 보관함