OptionsAPI to Composition API
1. export default { }
OptionsAPI
<script>
export default {
}
</script>
CompositionAPI
<script setup>
</script>
2. Components
OptionsAPI
import SampleComponent from '@/components'
<script>
export default {
	components: {
		SampleComponent
	}
}
</script>
CompositionAPI
import SampleComponent from '@/components'
<script setup>
</script>
3. Props
OptionsAPI
import SampleComponent from '@/components'
<script>
export default {
	props: {
		visible: Boolean,
		isUpdated: Boolean
	}
}
</script>
CompositionAPI
import SampleComponent from '@/components'
<script setup>
const { visible, isUpdated } = defineProps({
	visible: Boolean,
	isUpdated: Boolean
})
</script>
4. Event emitters
OptionsAPI
<script>
export default {
	emits: ['sampleEvent'],
	methods: {
		sampleMethod() {
			
		}
	}
}
</script>
CompositionAPI
<script setup>
const emit = defineEmits(['sampleEvent'])
</script>
5. Data
OptionsAPI
<script>
export default {
	data() {
		return {
			data: 'sample'
		}
	}
}
</script>
CompositionAPI
<script setup>
const data = ref('sample')
</script>
6. Methods
OptionsAPI
<script>
export default {
	methods: {
		sampleMethod(params) {
			// logic
		}
	}
}
</script>
CompositionAPI
<script setup>
function sampleMethod(params) {
	// logic
}
</script>
7. Computed
OptionsAPI
<script>
export default {
	computed: {
	    sampleData() {
			return sampleItems.value.reduce((total, item)) => {
			  return total + (item.price * item.quantity)
			}
	    }
	}
}
</script>
CompositionAPI
<script setup>
const sampleData = computed(() => {
	return sampleItems.value.reduce((total, item)) => {
	  return total + (item.price * item.quantity)
	}
})
</script>
8. Watch
OptionsAPI
<script>
export default {
	watch: {
	    sampleData(data) {
			// logic
	    }
	}
}
</script>
CompositionAPI
<script setup>
watch(sampleData, () => {
	// logic
})
</script>
9. Created
OptionsAPI
<script>
export default {
	created() {
		// logic
	}
}
</script>
CompositionAPI
<script setup>
// logic
</script>
10. OnMounted
OptionsAPI
<script>
export default {
	mounted() {
		// logic
	}
}
</script>
CompositionAPI
<script setup>
onMounted(() => {
	// logic
})
</script>
11. 글로벌 인스턴스 속성
라우터나 기타 플러그인으로 주입된 전역 인스턴스 속성
OptionsAPI                        CompositionAPI
this.$route         ---->      const route = useRoute()
this.$router        ---->      const router = useRouter()
this.$t             ---->      const { t } = useI18n()
this.$toast         ---->      const toast = useToast()
12. refs 템플릿 참조
OptionsAPI
<template>
	<input ref="input">
</template>
<script>
export default {
	mounted() {
		this.$refs.input.focus()
	}
}
</script>
CompositionAPI
<template>
	<input ref="input">
</template>
<script setup>
const input = ref(null)
onMounted(() => {
	input.value.focus()
})
</script>
※ 유의사항
1. 변수명 중복
OptionsAPI에서는 data, props, methods 등 각 속성에 선언한 항목에 접근할 때 this.항목명으로 접근하지만, CompositionAPI에서는 항목명 그대로 접근 하기 때문에 변수명이 중복되지 않아야 한다.
=> 함수의 인자, 지역변수가 props, data 속성에 선언한 변수명과 일치하지 않도록 수정
OptionsAPI
<script>
export default {
	props: {
		visible: Boolean,
	},
	data() {
		return {
			data: 'sample'
		}
	},
	methods: {
		sampleMethod(data, visible) {
			this.data = data
			this.visible = visible
		}
	}
}
</script>
CompositionAPI
<script setup>
const { visible } = defineProps({ visible: Boolean })
const data = ref('sample')
function sampleMethod(params1, params2) {
	data.value = params1
	visible = params2
}
</script>
2. 변수 & 함수 접근 방식 차이
OptionsAPI							CompositionAPI
[data]
this.변수명				---->      변수명.value
[props]
this.변수명				---->      변수명
[methods]
this.함수명()			---->      함수명()
3. 전역 함수 접근 방식 차이
OptionsAPI
<template>
	<Calendar
		:max-date="getDate(date)"
	/>
</template>
<script>
// import { getDate } from '../Utils'
export default {
	methods: {
		getDate(date) {
			return getDate(date)
		}
	}
}
</script>
CompositionAPI
<template>
	<Calendar
		:max-date="getDate(date)"
	/>
</template>
<script setup>
</script>