Composition API
컴포지션 API를 구현하는 곳
기존
<template>
<div>
<h2>Calculator</h2>
<div>
<input type="text" v-model="num1" @keyup="plusNumbers">
<span> + </span>
<input type="text" v-model="num2" @keyup="plusNumbers">
<span> = </span>
<span>{{result}}</span>
</div>
</div>
</template>
<script>
export default {
name : 'calculator',
data() {
return {
num1 : 0,
num2 : 0,
result : 0,
}
},
methods: {
plusNumbers(){
this.result = parseInt(this.num1) + parseInt(this.num2);
}
},
}
</script>
<style lang="">
</style>
컴포지션 API
<template>
<div>
<h2>Calculator</h2>
<div>
<input type="text" v-model="state.num1" @keyup="plusNumbers">
<span> + </span>
<input type="text" v-model="state.num2" @keyup="plusNumbers">
<span> = </span>
<span>{{state.result}}</span>
</div>
</div>
</template>
<script>
import { reactive } from '@vue/reactivity'
export default {
name : 'calculator',
setup () {
let state = reactive({ //reactive를 이용해서 num1,num2,result를 실시간 변경사항에 대한 반응형 적
num1:0,
num2:0,
result:0,
});
function plusNumbers() {
state.result = parseInt(state.num1) + parseInt(state.num2);
}
return {
state,
plusNumbers,
}
}
}
</script>
<style lang="scss" scoped>
</style>
컴포지션 API - 2
<template>
<div>
<h2>Calculator</h2>
<div>
<input type="text" v-model="state.num1">
<span> + </span>
<input type="text" v-model="state.num2">
<span> = </span>
<span>{{state.result}}</span>
</div>
</div>
</template>
<script>
import { reactive } from '@vue/reactivity'
export default {
name : 'calculator',
setup () {
let state = reactive({
num1:0,
num2:0,
//computed를 이용해서 num1 , num2가 변경이 일어나면 즉시 result로 더한 값을 반환
result:computed(()=>parseInt(state.num1)+parseInt(state.num2)),
});
return {
state,
}
}
}
</script>
<style lang="scss" scoped>
</style>
컴포지션 API - 3
<template>
<div>
<h2>Calculator</h2>
<div>
<input type="text" v-model="num1" />
<span> + </span>
<input type="text" v-model="num2" />
<span> = </span>
<span>{{ result }}</span>
</div>
</div>
</template>
<script>
import { reactive, toRefs } from "@vue/reactivity";
function plusCalculator() {
let state = reactive({
num1: 0,
num2: 0,
//computed를 이용해서 num1 , num2가 변경이 일어나면 즉시 result로 더한 값을 반환
result: computed(() => parseInt(num1) + parseInt(num2)),
});
return toRefs(state); // 반응형으로 선언된 num1 , num2 , result가 외부 function에서 정상적으로 동작하
기 위해서는
// toRefs를 사용
/*
함수를 컴포넌트 밖으로 빼면 사용자가 입력한 값에 대한 반응형 처리가 불가능
그래서 toRefs를 사용하여 컴포넌트 밖에서도 반응형 처리가 가능하도록 함
*/
}
export default {
name: "calculator",
setup() {
let {num1,num2,result} = plusCalculator();
return{
num1,num2,result
}
},
};
</script>
<style lang="scss" scoped>
</style>
컴포지션 API - 4
import { computed, reactive, toRef } from 'vue';
const plusCalculator = () => {
let state = reactive({
num1: 0,
num2: 0,
//computed를 이용해서 num1 , num2가 변경이 일어나면 즉시 result로 더한 값을 반환
result: computed(() => parseInt(num1) + parseInt(num2)),
});
return toRefs(state); // 반응형으로 선언된 num1 , num2 , result가 외부 function에서 정상적으로 동작하기 위해서는
// toRefs를 사용
};
export {
plusCalculator
};
<template>
<div>
<h2>Calculator</h2>
<div>
<input type="text" v-model="num1" />
<span> + </span>
<input type="text" v-model="num2" />
<span> = </span>
<span>{{ result }}</span>
</div>
</div>
</template>
<script>
import {plusCalculator} from '../common.js'
export default {
name: "calculator",
setup() {
let {num1,num2,result} = plusCalculator();
return{
num1,num2,result
}
},
};
</script>
<style lang="scss" scoped>
</style>
<template>
<div>
<CompositionAPIInject />
</div>
</template>
<script>
import { provide } from '@vue/runtime-core'
export default {
components : {
CompositionAPIInject,
},
setup () {
provide('title', 'Vue.js 프로젝트'); //provide함수를 통해서 전달할 key,value 설정
return {}
}
}
</script>
<style lang="scss" scoped>
</style>
<template>
<div>
{{title}}
</div>
</template>
<script>
import { inject } from '@vue/runtime-core'
export default {
setup () {
const title = inject('title');
//inject를 사용해서 provide에서 정의한 키로 데이터를 전달받음
return {title}
}
}
</script>
<style lang="scss" scoped>
</style>