May 06, 2023
이미지 출처: https://vueschool.io/articles/vuejs-tutorials/options-api-vs-composition-api/
<script>
export default {
props: {
name: String,
price: Number,
},
setup(props) {
console.info('name', props.name)
console.info('price', props.price)
}
}
</script>
reactive data가 아니므로 context는 destructure 가능. props는 불가능.
<script>
export default {
props: {
name: String,
price: Number,
},
setup(props, { attrs, slots, emit}) {
console.info('name', props.name)
console.info('price', props.price)
}
}
</script>
ref로 값을 전달하면 Vue는 value property를 가지는 object로 감싼다.
그래서 접근하거나 변형할 때 .value를 통한다. wrapper로 감싸면 반응성을 잃지 않고 안전하게 사용할 수 있다. script 외부에서는 unwrap한다.
아래 예제에서, name을 let으로 선언하고, .value를 통해 값을 바꿔도 반응성은 유지된다.
setup() {
let name = ref("The Snazzy Burger");
name.value = "Nice Burger"
function placeOrder() {
alert("Your order has been placed!");
}
const addItemToCart = (item) => {
alert(`You added ${item} to your cart!`);
};
return { name, placeOrder, addItemToCart } ;
},
하지만 .value를 빼먹으면 값이 교체되서 반응성을 잃는다.
<template>
<h1>{{name}}</h1>
<input type="text" v-model="name">
</template>
<script>
import { ref } from "vue";
export default {
setup() {
let name = ref("The Snazzy Burger");
name = "Nice Burger"
return { name } ;
},
}
</script>
import { ref } from 'vue'
export default () => {
return {
name: ref('Pizza'),
price: ref(1000),
}
}
template
에선 name
setup
에선 name.value
options api
에선 this.name
import { reactive, toRefs } from 'vue'
export default () => {
return toRefs(
reactive({
name: ref('Pizza'),
price: ref(1000),
time: ref(2000),
})
)
}
let posts = reactive(['post 1', 'post 2'])
posts = ['post 3', 'post 4']
const pricePretty = computed(() => `$${props.price.toFixed(2)}`)
const pricePrettySentence = computed(() => `Price: ${pricePretty.value}`)
options api처럼, immediate, deep option이 가능
watch(
name,
(newName, oldName) => {
console.log(`Name changed from ${oldName} to ${newName}`)
},
{
immediate: true,
deep: true,
}
)
이상 vue school 강의를 듣고 요약한 내용이다. 아무래도 vue core member들이 강의한 내용이다 보니 이해도 잘 되고, 일반 블로그 글들에선 볼 수 없었던 관점 등을 배울 수 있었다.
경험이 쌓여서 ref와 reactive 중 어느 것을 선호할 수 있는 정도가 되고 싶다. options api의 코드 재사용성은 정말 안 좋았는데, composition api로 많이 개선됐으면 한다. 이것도 많이 써보면서 사례들을 경험해나가고 싶다.