หลังจากที่ vue3 เป็น official มาสักพักแล้วเรามาลองดู feature ใหม่ๆใน vue3 และสิ่งที่เปลี่ยนไปจาก vue2 กันอาจจะไม่ cover ทั้งหมดจะทยอยเพิ่มเติมให้ครับ
Multi Root Node (Feature)
เป็น feature ที่ผมชอบมากครับจริงๆแล้วมันคือ fragment ใน react
// Hero.vue
<template>
<!-- Hero Component -->
<h1>Hello</h1>
<h2>Vue3</h2>
</template>
NOTE
เวลาใช้งาน component ที่เป็น fragment จะไม่สามารถใช้พวก directives ได้เนื่องจากตอนมันไป render แล้วไม่มี root element
<template>
<Hero v-if="false" />
<Hero v-show="false" />
</template>
Custom Component with v-model (Breaking Change)
แน่นอนครับเวลาเราจะเรียกใช้ v-model ใน custom component เราจะส่งค่า value ผ่าน props และรับค่า emit value
vue 2
<template>
<div>
<h1>{{ value }}</h1>
<button type="button" @click="handleClick">click</button>
</div>
</template>
<script>
export default {
props: {
value: {
type: String, // up to you
default: undefined,
},
},
methods: {
handleClick() {
this.$emit("input", "iu ❤️");
},
},
};
</script>
เรียกใช้
<template>
<div>
<SomeComponent v-model="msg" />
<!-- or -->
<SomeComponent :value="msg" @input="val => msg = val" />
</div>
</template>
<script>
import SomeComponent from "./components/SomeComponent.vue";
export default {
components: {
SomeComponent,
},
data: () => ({
msg: "i love someone",
}),
};
</script>
vue 3
// SomeComponent.vue
<template>
<h1>{{ modelValue }}</h1>
<button type="button" @click="handleClick">click</button>
</template>
<script>
export default {
props: {
modelValue: {
type: String, // up to you
default: undefined,
},
},
setup(_props, { emit }) {
const handleClick = () => {
emit("update:modelValue", "iu ❤️");
};
return { handleClick };
},
};
</script>
เรียกใช้
<template>
<SomeComponent v-model="msg" />
<!-- or -->
<SomeComponent :modelValue="msg" @update:modelValue="val => msg = val" />
</template>
<script>
import { ref } from "vue";
import SomeComponent from "./components/SomeComponent.vue";
export default {
components: {
SomeComponent,
},
setup() {
const msg = ref("i love someone");
return { msg };
},
};
</script>
จะสังเกตได้ว่าสิ่งที่เปลี่ยนแปลงไปก็คือ props value
เป็น modelValue
และ emit event จาก input
เป็น update:modelValue
เมื่อลองรันโค้ดดูแล้วจะรู้ว่าผมชอบใครอยู่ทั้ง vue2 และ vue3 จะให้คำตอบที่เหมือนกัน(แน่นอน ผมรักเดียว อิอิ)
ก็ขอจบ part 1 ไว้เท่านี้ก่อนแล้วผมจะค่อยๆทำ part ต่อไปมาเรื่อยๆ ครับผม Happy Coding ครับ 🥳