티스토리 뷰

dev/vue3

커스텀 컴포지션 함수

dev_0hoon 2025. 1. 25. 10:06
<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
링크
«   2025/04   »
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
글 보관함