Vue 3.0มีอะไรเปลี่ยนแปลง/มีอะไรใหม่บ้าง?

29834 단어 vuenews

เขียนใหม่ด้วย 타자 스크립트


ภาษา 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 นะ

좋은 웹페이지 즐겨찾기