composition api
는 대규모 프로젝트에서도 코드의 재사용성을 증가와 로직에 대한 관심사를 모으기 위해 새롭게 추가된 API이다. namespace 충돌을 방지할 수 있고 코드 로직에 대한 관심사가 한군데에 집중되게 되어 가독성 면에서 큰 이점이 존재한다. 특히 코드의 재사용성과 타입 추론이 크게 개선되었다.
기존의 vue2 버전에서는 직관적인 확인이 어렵고 재사용성이 떨어진다. 이러한 문제를 해결하기 위해 composition API를 사용한다.
<template>
<div>
<h1>{{ countWithUnit }}</h1>
<button @click="increase">Increase</button>
<button @click="decrease">Decrease</button>
</div>
</template>
<script>
export default {
data() {
return {
count: 0
}
},
computed: {
countWithUnit() {
return this.count + '입니다'
}
},
methods: {
increase() {
++this.count
},
decrease() {
--this.count
}
}
}
</script>
<template>
<div>
<h1>{{ countWithUnit }}</h1>
<button @click="increase">Increase</button>
<button @click="decrease">Decrease</button>
</div>
</template>
<script>
import { ref, computed } from '@vue/composition-api'
const useCount = () => {
const count = ref(0)
const countWithUnit = computed(() => count.value + '입니다')
const increase = () => ++count.value
const decrease = () => --count.value
return { countWithUnit, increase, decrease }
}
export default {
setup() {
const { countWithUnit, increase, decrease } = countWithUnit()
return {
countWithUnit,
increase,
decrease
}
}
}
</script>
<script>
export default {
mounted() {
},
updated() {
},
destroyed() {
},
}
</script>
<script>
import {
onMounted,
onUpdated,
onUnmounted
} from '@vue/composition-api
const funcion1 = () => {
onMounted(() => {
// mounted1
})
}
const funcion2 = () => {
onMounted(() => {
// mounted2
})
}
export default {
setup() {
function1() // mounted1
function2() // mounted2
onUpdated(() => {
// updated
})
destroyed(() => {
// unmounted (destroyed)
})
}
}
</script>
기존 Vue 2 | Composition-API |
---|---|
beforeCreate | setup |
created | setup |
beforeMount | onBeforeMount |
mounted | onMounted |
beforeUpdated | onBeforeUpdated |
updated | onUpdated |
beforeDestroyed | onBeforeUnmount |
destroyed | onUnmounted |
errorCaptured | onErrorCaptured |
반응형 데이터는 값이 변경됨에 따라 이를 감지하고 해당 값에 종속된 작업(Side Effect)이 수행된다.
data() 내부에 선언을 통해 반응형 데이터를 만든다.
<template>
<div>
{{ message }}
</div>
</template>
<script>
export default {
data() {
return {
message: 'Hello World!!'
}
}
}
</script>
Composition-API의 경우, 2가지 유형(reactive, ref)으로 반응형 데이터를 만든다.
<script>
import { reactive, ref, computed } from '@vue/composition-api
export default {
setup() {
// 1. reactive
const reactiveValue = reactive({ name: 'sooni'})
reactiveVlaue.name // sooni
// 2. ref
const refValue = ref(10)
refValue.value // 10
}
}
</script>
ref 객체는 원본 값을 value라는 속성에 담아두고 변경을 감시하는 객체이며, reactive는 원본 객체 자체에 변경을 감지하는 옵저버를 추가하여 그대로 반환한 값이다.
어떤 유형의 값인지 확인하기 위한 isRef, reactive 값을 ref 값으로 변환하는 toRefs가 존재한다.
ref값과 reactive값에 따라 다르게 처리해야 할 경우 사용한다.
<script>
import { reactive, ref, isRef } from '@vue/composition-api
export default {
setup() {
const reactiveValue = reactive({ name: 'sooni' })
const refValue = ref(10)
const printValue = obj => {
console.log(isRef(obj) ? obj.value : obj)
}
}
}
</script>
<script>
import { reactive, ref, isRef } from '@vue/composition-api
const useMousePoint = () => {
const pos = reactive({ x: 0, y: 0 })
return toRefs(pos) // convert to ref
}
export default {
setup() {
const { x, y } = useMousePosition()
return {
x,
y
}
}
}
</script>
<template>
<div>
<h1>{{ value2x }}</h1>
</div>
</template>
<script>
import { ref, computed } from '@vue/composition-api'
export default {
setup() {
const myValue = ref(10)
const value2x = computed(() => myValue * 2)
return {
value2x
}
}
}
</script>