사용해야하는 이유

  • 큰 컴포넌트의 가독성을 높임
  • 뷰 2는 코드 재사용시 약점 있음
  • typescript 지원 제한

가독성 문제점

vue2 문제점

  • 검색창을 만드는 경우 vue2는 같은 정보를 여러 곳에 추가해야 함
  • components, props, data, computed, methods, lifecycle methods ⇒ 6개의 옵션이 있음
  • 아주 복잡함 !!! 한번에 두면 더 읽기 쉬울 것 같음
export default{
    data() {
        // search data
        // sorting 
    }
    methods:{
        // search data
        // sorting
    }
}

vue 3 해결책

  • composition api 를 통해 새로운 구문을 만듦
  • 단, 문제점이 있음
    • setup 에 다 넣는 경우 setup이 길어 질수 있음
export default {
    setup() {
        // search data
        // sorting
    }
}
  • 해결책
export default {
    setup() {
        return { ...useSearch(), ...useSorting() }
    }
}
function useSearch() {
    // search data
}
function useSorting() {
    // sorting
}

컴포넌트 재사용의 문제점

vue 2 문제점- mixins

단점

  • 변수명 충돌 가능
  • 관계가 명확하지 않음
  • 재사용 하기 어려움
const productSearchMixin = {
    data () {
        return {
                // search data
        }
    },
    methods: {
        // search func
    }
}

const resultSortMixin = {
    data() {
        return {
            // sorting data
        }
    },
    methods: {
        // sorting func
    }
}
export default {
    mixins: [productSearchMixin, resultSortMixin]
}

vue3 해결책

  • 각각의 함수는 수정 가능한 mixins을 반환

장점

  • 재사용 용이
  • 관계가 분명해짐

단점

  • 명확한 이름을 지정해 줘야함
  • 복잡한 porperty 추가시 mixin 어떤 porperty가 보여지는지 알아야함
// mixins/factories/search.js
export default function searchMixinFactory({...}) {
    // search function
}
//  mixins/factories/sorting.js
export default function sortingMixinFactory({...}) {
    // sorting function
}
// search.vue
// 이 파일에서 위의 두개의 파일로 각각의 설정들을 보냄
import searchMixinFactory from '@mixins/factories/search'
import sortingMixinFactory from '@mixins/factories/sorting'

export default {
    mixins: [
        searchMixinFactory({
            namespace: 'productSearch'
        }),
        sortingMixinFactory({
            namespace: 'resultSorting'
        })
    ]
}

Mixins problem 해결책 - scoped slots

단점

  • 들여쓰기 증가
  • 노출된 properties 만 템플릿에서 사용가능하다
  • 한 개 대신 세 개의 컴포넌트를 사용해야함 > 약간 귀찮음
// componets/generic-sorting.vue
<script>
export default {
    props: ['input','options'],

}
</script>
<template>
    <div>
        <slot v-bind ="{options, index,output}"/>
    </div>
</template>
// componets/generic-search.vue
<script>
export default {
    props: ['getSearch']
}
</script>
<template>
    <div>
        <slot v-bind="{query, results, rum}"/>
    </div>
</template>
// search.vue
<template>
    <GenericSearch :get-results="getProducts" v-slot="productSearch">
        <GenericSorting 
            :input = "productSearch.result"
            :options=resultSortingOptions"
            v-slot="resultSorting"
        >

vue3 의 composition api

장점

  • 약간의 코드로 컴포넌트에 쉽게 넣을 수 있음
  • 친숙한 코드
  • mixins과 scoped slot 의 유연성 (함수에서만)

단점

  • 배움이 필요함
// use/search.js
export default function useSearch(getResults) {
    // search func
}
// use/sorting.js
export default function useSorting({input, options}) {
    // sorting func
}
// search.vue
import useSearch form '@use/search'
import useSorting from '@use/sorting'
export default {
    setup() {
        const productSearch = useSearch(~)
        const resultSorting = useSorting({~~})

        return {productSearch, resultSorting}
    }
}

언제 composition api 사용하는가

  • 컴포넌트가 너무 커지고 구조화를 원할때
  • 컴포넌트 재사용 높임
  • typescript support

'Vue.js > vue3' 카테고리의 다른 글

[vue3] Reactivity Utilities  (0) 2020.09.30
[vue3] composition API  (0) 2020.09.30
[vue3] Reactivity APIs  (0) 2020.07.02
[vue3] setup  (0) 2020.07.02

+ Recent posts