Vue 3.0มีอะไรเปลี่ยนแปลง/มีอะไรใหม่บ้าง?
เขียนใหม่ด้วย 타자 스크립트
ภาษา JavaScriptนั้นไม่มี 유형ของตัวแปรทำให้เวลาเขียนโปรแกรมมีโอกาสเกิดข้อผิลพลาดเยอะ ดังนั้นการเขียนงานโปรเจคใหญ่ๆ คนเลยนิยมเปลี่ยนไปใช้ 타자 스크립트แทน (ถ้ายังไม่รู้จัก TypeScriptอ่านต่อได้ที่นี่)
สำหรับ Vue 3.0นี้ก็เป็นการเขียนใหม่ด้วย 타자 스크립트แทน แต่เวลาเราเอามาใช้งาน เราสามารถเลือกได้ว่าจะใช้แบบ JavaScriptตามปกติ หรือจะใช้แบบ 타자 스크립트ก็ได้
interface Book {
title: string
author: string
year: number
}
const Component = defineComponent({
data() {
return {
book: {
title: 'Vue 3 Guide',
author: 'Vue Team',
year: 2020
} as Book
}
}
})
อ่านเรื่อง TypeScript ต่อได้ที่นี่ JSX
เป็นฟีเจอร์ที่เอามาจาก 반응하다นั้นคือแทนที่จะใช้ Hyperscriptแบบนี้
Vue.h(
Vue.resolveComponent('anchored-heading'),
{
level: 1
},
[Vue.h('span', 'Hello'), ' world!']
)
Vue.h ย่อมาจาก Hyperscript ซึ่งหมายถึง script ที่เอาไว้สร้าง HTML structures นั่นเอง
การเขียน JSX 회사ได้จะทำให้เราเขียน HTMLลงไปในโค้ด JavaScriptตรงๆ ได้เลย
import AnchoredHeading from './AnchoredHeading.vue'
const app = createApp({
render() {
return (
<AnchoredHeading level={1}>
<span>Hello</span> world!
</AnchoredHeading>
)
}
})
app.mount('#demo')
อ่านเรื่อง JSX ต่อได้ที่นี่ 미국 석유 학회ที่เปลี่ยนไปใน Vue 3
ในหัวข้อนี้ขอยกตัวอย่างโค้ดข้างล่างนี่ ซึ่งรันได้ปกติใน Vue 2
<div id="app">
<h1>{{ title }}</h1>
<my-button @whenclick="changeTitleText"></my-button>
</div>
<script src="https://unpkg.com/[email protected]"></script>
<script>
Vue.component('my-button', {
template: `
<button @click="handleClick">Click Me!</button>
`,
methods: {
handleClick(){
this.$emit('whenclick')
}
},
})
let app = new Vue({
el: '#app',
data: {
title: 'นี่คือ Title แบบ Vue 2',
},
methods: {
changeTitleText(){
this.title = 'โค้ดนี้ทำงานได้ใน Vue 2'
}
},
})
</script>
ในตัวอย่างนี้มีการสร้าง 구성 부분ชื่อ my-button
ขึ้นมาหนึ่งตัว แล้วตั้งค่าไว้ว่าถ้ามีการคลิก ให้เปลี่ยนข้อความ title
ซะทีนี้ ถ้าเราเปลี่ยนไปใช้ Vue 3ตัวนี้แทน
https://unpkg.com/[email protected]
เราจะพบว่าโค้ดของเรารันไม่ได้ไปซะแล้วสาเหตุก็เพราะว่า 미국 석유 학회การเรียกใช้งานมีการเปลี่ยนแปลง
วิธี createApp
จากเดิมใน Vue 2ถ้าเราจะสร้าง 활용단어참조ขึ้นมา ก็จะใช้วิธีการ 새 Vueขึ้นมาตรงๆ เลย
const app = new Vue({
el: '#app',
//TODO
})
แต่สำหรับ Vue 3จะเปลี่ยนไปใช้คำสั่ง createApp
แทน (ไม่สามารถสร้างเองได้แล้ว ต้องสร้างผ่าน 공장 기능ที่ Vueเตรียมไว้ให้เท่านั้น)const app = Vue.createApp({
//TODO
})
app.mount('#app')
หรือimport { createApp } from 'vue'
const app = createApp({
//TODO
})
app.mount('#app')
อีกเรื่องหนึ่งคือการ 등반แอพเข้ากับ htmlโดยใช้ el
นั้นโดนตัดออกไปแล้วไปใช้วิธีการ 등반ด้วยเมธอด
.mount()
หลังจากสร้างแอพไปแล้วแทน ซึ่งเป็นการแยกส่วนโลจิคออกจากการกำหนดส่วนแสดงผล (HTML)ออกจากกัน ทำให้ตอนนี้เราสามารถสร้างแอพเปล่าๆ โดยยังไม่ต้อง 등반ได้แล้ว ถ้าอยากเอาไปทำเทสเพิ่มก็ทำได้ง่ายขึ้น데이터ต้องเป็น 방법เท่านั้น
ปกติ
data
ของ Vue 2นั้นสามารถกำหนดเป็น 대상หรือ 작용ที่รีเทิร์น 대상กลับมาแบบไหนก็ได้new Vue({
data: {
title: 'นี่คือ Title แบบ Vue 2',
},
})
แต่สำหรับ Vue 3ถูกกำหนดว่า data
จะต้องเป็น 작용เท่านั้นVue.createApp({
data(){
return {
title: 'นี่คือ Title แบบ Vue 2',
}
},
})
구성 부분ผูกกับ 응용 프로그램
ใน Vue 2เวลาเราสร้างคอมโพเนนท์ เราจะสั่งผ่านตัวแปร Vueที่เป็นระดับ 글로벌แปลว่าคอมโพเนนท์นี้สามารถเรียกใช้จาก 활용단어참조ของ Vueตัวไหนก็ได้
Vue.component('my-button', {
template: `
<button @click="handleClick">Click Me!</button>
`,
methods: {
handleClick(){
this.$emit('whenclick')
}
},
})
แต่สำหรับ Vue 3แล้วการจะสร้างคอมโพเนนท์จะต้องสร้างให้แอพตัวใดตัวหนึ่งไปเลยconst app = Vue.createApp({
//TODO
})
app.component('my-button', {
emits: ['whenclick'], //optional
template: `
<button @click="handleClick">Click Me!</button>
`,
methods: {
handleClick(){
this.$emit('whenclick')
}
},
})
emits
เป็น properties ที่จะกำหนด หรือไม่กำหนดก็ได้ หน้าที่ของมันคือเอาไว้เก็บชื่อเมธอดทั้งหมดที่คอมฑโพเนนท์ตัวนี้ทำได้ (มันก็คือ$emit
อะไรได้บ้างนั่นแหละ) แต่การใส่ในemits
นั้นจะทำให้เวลาเรามาอ่านว่าคอมโพเนนท์ตัวนี้มีอะไรให้เรียกใช้ได้บ้างก็จะดูจากตรงนี้ได้เลย ไม่ต้องเสียเวลาไปไล่โค้ดข้างในอีกที
Vue 라우터ต้องสร้างด้วย createRouter()
เร้าเตอร์ก็เป็นอีกตัวที่มีการเปลี่ยนรูปแบบการเขียน
import Vue from 'vue'
import VueRouter from 'vue-router'
import App from './App.vue'
import FirstPage from './pages/FirstPage.vue'
import Page from './pages/FirstPage.vue'
Vue.use(VueRouter)
new Vue({
render: (h) => h(App),
router: new VueRouter({
mode: 'history',
routers: [
{ path: '/', component: FirstPage },
{ path: '/second', component: SecondPage },
],
}),
}).$mount('#app')
โดยการสร้าง 라우터จะต้องสร้างแยกตั้งหากด้วยคำสั่ง createRouter()
รวมถึงโหมด 역사ที่ตอนแรกเป็นค่าคอนฟิก, ใน Vue 3ก็แยกออกมาเป็น
createWebHistory()
แล้วเหมือนกันimport {createApp} from 'vue'
import {createRouter, createWebHistory} from 'vue-router'
import App from './App.vue'
import FirstPage from './pages/FirstPage.vue'
import Page from './pages/FirstPage.vue'
const router = createRouter({
history: createWebHistory(),
routers: [
{ path: '/', component: FirstPage },
{ path: '/second', component: SecondPage },
],
})
const app = createApp(App)
app.use(router)
router.isReady().then(() => {
app.mount('#app')
})
Vuex 회사ต้องสร้าง 백화점ด้วย createStore()
คล้ายๆ กับข้อเมื่อกี้คือถ้าในโค้ดเรามีการใช้ Vuex 회사การจะสร้าง 백화점ขึ้นมาแทนที่จะ 새로운 Vuex.백화점ตรงๆ ก็จะเปลี่ยนไปสร้างผ่าน
createStore()
แทนimport Vue from 'vue'
import Vuex from 'vuex'
import App from './App.vue'
const store = new Vuex.Store({
//...
})
new Vue({
store: store,
render: (h) => h(App),
}).$mount('#app')
แบบนี้import {createApp} from 'vue'
import {createStore} from 'vuex'
import App from './App.vue'
const store = createStore({
//...
})
const app = createApp(App)
app.use(store)
app.mount('#app')
พวกค่าต่างๆ ของ 백화점เช่น state
, mutations
, getters
, actions
ก็เซ็ตเหมือนเดิมทุกอย่าง ไม่มีอะไรเปลี่ยนแปลง...
โดยรวมแล้ว Vue 3มีการเปลี่ยน 미국 석유 학회ให้แยกส่วนกันมากขึ้น ทำให้โครงสร้างโค้ดถูกแบ่งเป็นโมดูลๆ จัดการและเทสง่ายขึ้น
파편
สำหรับใช้ที่เคยใช้ 반응하다มาก่อน 파편ใน Vueก็ใช้คอนเซ็ปเดียวกันนั่นแหละ
ตามปกติแล้วเวลาเราสร้าง 견본จำเป็นจะต้องมี 루트 요소 1ตัวครอบทุกอย่างเอาไว้ ซึ่งหลายๆ ครั้งมันก็ไม่สะดวกเอาซะเลย
<!-- Layout.vue -->
<template>
<div>
<header>...</header>
<main>...</main>
<footer>...</footer>
</div>
</template>
สำหรับ Vue 3นั้นอนุญาตให้เราสร้าง 루트 요소หลายตัวใน 견본ได้แล้ว<!-- Layout.vue -->
<template>
<header>...</header>
<main v-bind="$attrs">...</main>
<footer>...</footer>
</template>
전송 구성 요소
전송เป็นฟีเจอร์ที่ทำให้คอมโพเนนท์บางส่วนที่เราสร้างขึ้นมาใน 활용단어참조สามารถ "เทเลฟอร์ท"หรือ "วาร์ป"ออกไปข้างนอกได้!
ตัวอย่างที่เข้าใจง่ายที่สุดน่าจะเป็น 정태 동사หรือการที่มีกล่องเหรือเฟรมอะไรสักอย่างเด้งขึ้นมาซ้อนทับ 수용물ของเราเป็นอีกเลเยอร์หนึ่ง
สำหรับ Vueเวอร์ชันก่อนๆ ที่ต้องเขียนทุกอย่างอยู่ในขอบเขตของ 활용단어참조เท่านั้น
ถ้าเราจะสร้าง 정태 동사ขึ้นมาก็จะต้องสร้างไว้ข้างในแอพนั้นแหละ
แต่สำหรับ Vue 3เราสามารถกำหนดสิ่งที่เรียกว่า 전송เพื่อบอกว่าโค้ดตรงนี้นะ เราจะส่งมันออกไปแสดงผลข้างนอกแอพ!
จากเดิมเป็นโค้ดแบบนี้
const app = Vue.createApp({});
app.component('modal-button', {
template: `
<button @click="modalOpen = true">
Open full screen modal!
</button>
<div v-if="modalOpen" class="modal">
<div>
I'm a modal!
<button @click="modalOpen = false">
Close
</button>
</div>
</div>
`,
data() {
return {
modalOpen: false
}
}
})
ให้เราเพิ่ม <teleport to="body">
ลงไปครอบคอมโพเนนท์ส่วนที่ต้องการส่งออกไปข้างนอก (เช่นเคสนี้ส่งไปแสดงผลที่ชั้น 차체app.component('modal-button', {
template: `
<button @click="modalOpen = true">
Open full screen modal! (With teleport!)
</button>
<teleport to="body">
<div v-if="modalOpen" class="modal">
<div>
I'm a teleported modal!
(My parent is "body")
<button @click="modalOpen = false">
Close
</button>
</div>
</div>
</teleport>
`,
data() {
return {
modalOpen: false
}
}
})
จริงๆ ยังมีอีกหลายฟีเจอร์ที่ Vue 3มีการเพิ่มฝเปลี่ยนแปลง แต่อันนี้เลือกมาเฉพาะๆ ตัวที่คิดว่าสำคัญป.ล. Vue 3นั้นออกเวอร์ชัน 3.0.0 เรียบร้อยแล้ว แต่เฟรมเวิร์คหลัๆ บางตัวก็ยังไม่เสร็จดี เช่น 라우터หรือ Vuex 회사และสำหรับการติดตั้งจะต้องใช้
npm i vue@next
หากต้องการจะใช้เวอร์ชัน 3 (ถ้าใช้ npm i vue
จะได้เวอร์ชัน 2) ซึ่งการเปลี่ยนแปลงให้ vue 3เป็นตัวหลักแทนน่าจะดำเนินการเสร็จภายในสิ้นปี 2020นี้อ่านเพิ่มเติมได้ที่ Release Note นะ
Reference
이 문제에 관하여(Vue 3.0มีอะไรเปลี่ยนแปลง/มีอะไรใหม่บ้าง?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/centrilliontech/vue-3-0-2kbo텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)