ไทย

เจาะลึก Vue.js 3 Composition API เรียนรู้วิธีสร้างแอปพลิเคชัน Vue.js ที่นำกลับมาใช้ใหม่ได้ ดูแลรักษาง่าย และทดสอบได้ พร้อมตัวอย่างและแนวทางปฏิบัติที่ดีที่สุดสำหรับนักพัฒนาทั่วโลก

Vue.js 3 Composition API: เจาะลึกสำหรับนักพัฒนาระดับโลก

Vue.js ได้กลายเป็นตัวเลือกยอดนิยมอย่างรวดเร็วสำหรับการสร้างเว็บแอปพลิเคชันสมัยใหม่ ด้วยเส้นทางการเรียนรู้ที่เข้าถึงง่ายและฟีเจอร์ที่ทรงพลัง Vue.js 3 ได้ก้าวไปอีกขั้นด้วยการเปิดตัว Composition API ซึ่งเป็นวิธีใหม่ในการจัดระเบียบตรรกะของคอมโพเนนต์ของคุณ บทความเจาะลึกนี้จะให้คำแนะนำที่ครอบคลุมเพื่อทำความเข้าใจและใช้ Composition API อย่างมีประสิทธิภาพ พร้อมมอบทักษะให้คุณสามารถสร้างแอปพลิเคชัน Vue ที่ดูแลรักษาง่าย นำกลับมาใช้ใหม่ได้ และทดสอบได้ดียิ่งขึ้น

Composition API คืออะไร?

Composition API คือชุดของ API ที่ช่วยให้เราสามารถสร้างคอมโพเนนต์ Vue โดยใช้ฟังก์ชันที่นำเข้ามา แทนที่จะเป็นการประกาศตัวเลือก (options) โดยพื้นฐานแล้ว มันช่วยให้คุณสามารถจัดกลุ่มตรรกะที่เกี่ยวข้องกันไว้ด้วยกัน โดยไม่คำนึงว่าจะปรากฏที่ใดในเทมเพลต ซึ่งแตกต่างจาก Options API (data, methods, computed, watch) ที่บังคับให้คุณจัดระเบียบโค้ดตามหมวดหมู่ที่กำหนดไว้ล่วงหน้าเหล่านี้ ลองนึกภาพว่า Options API คือการจัดระเบียบโค้ดของคุณตาม *ประเภทของมัน* (ข้อมูล, เมธอด ฯลฯ) ในขณะที่ Composition API ให้คุณจัดระเบียบโค้ดตาม *หน้าที่ของมัน*

หัวใจหลักของ Composition API อยู่ที่ฟังก์ชัน setup() ฟังก์ชันนี้เป็นจุดเริ่มต้นสำหรับการใช้ Composition API ภายในคอมโพเนนต์ ภายใน setup() คุณสามารถกำหนดสถานะ reactive, คุณสมบัติ computed, เมธอด และ lifecycle hooks โดยใช้ฟังก์ชัน composable

ทำไมต้องใช้ Composition API?

Composition API มีข้อดีหลายประการเหนือกว่า Options API แบบดั้งเดิม โดยเฉพาะอย่างยิ่งสำหรับแอปพลิเคชันที่มีขนาดใหญ่และซับซ้อนมากขึ้น:

การทำความเข้าใจแนวคิดหลัก

เรามาเจาะลึกแนวคิดสำคัญที่เป็นรากฐานของ Composition API กัน:

1. setup()

ดังที่ได้กล่าวไปแล้ว setup() เป็นจุดเริ่มต้นสำหรับการใช้ Composition API มันเป็นตัวเลือกของคอมโพเนนต์ที่จะถูกดำเนินการก่อนที่คอมโพเนนต์จะถูกสร้างขึ้น ภายใน setup() คุณจะกำหนดสถานะ reactive, คุณสมบัติ computed, เมธอด และ lifecycle hooks จากนั้นส่งคืนอ็อบเจ็กต์ที่มีค่าที่คุณต้องการเปิดเผยให้กับเทมเพลต

ตัวอย่าง:

import { ref } from 'vue'

export default {
  setup() {
    const count = ref(0)

    const increment = () => {
      count.value++
    }

    return {
      count,
      increment
    }
  }
}

ในตัวอย่างนี้ เราใช้ ref เพื่อสร้างตัวแปร reactive ที่ชื่อว่า count นอกจากนี้เรายังกำหนดเมธอดที่ชื่อ increment ซึ่งจะเพิ่มค่าของ count สุดท้ายเราส่งคืนอ็อบเจ็กต์ที่มี count และ increment ซึ่งทำให้สามารถใช้งานได้ในเทมเพลตของคอมโพเนนต์

2. สถานะ Reactive ด้วย ref และ reactive

Composition API มีฟังก์ชันหลักสองอย่างสำหรับสร้างสถานะ reactive คือ ref และ reactive

ตัวอย่างการใช้ ref:

import { ref } from 'vue'

export default {
  setup() {
    const message = ref('Hello, Vue!')

    const updateMessage = (newMessage) => {
      message.value = newMessage
    }

    return {
      message,
      updateMessage
    }
  }
}

ตัวอย่างการใช้ reactive:

import { reactive } from 'vue'

export default {
  setup() {
    const state = reactive({
      name: 'John Doe',
      age: 30
    })

    const updateName = (newName) => {
      state.name = newName
    }

    return {
      state,
      updateName
    }
  }
}

3. คุณสมบัติ Computed ด้วย computed

คุณสมบัติ Computed คือค่าที่ได้มาจากสถานะ reactive อื่นๆ มันจะอัปเดตโดยอัตโนมัติเมื่อใดก็ตามที่ค่าที่อ้างอิงเปลี่ยนแปลงไป ฟังก์ชัน computed รับฟังก์ชัน getter เป็นอาร์กิวเมนต์และส่งคืน ref reactive แบบอ่านอย่างเดียว

ตัวอย่าง:

import { ref, computed } from 'vue'

export default {
  setup() {
    const firstName = ref('John')
    const lastName = ref('Doe')

    const fullName = computed(() => {
      return `${firstName.value} ${lastName.value}`
    })

    return {
      firstName,
      lastName,
      fullName
    }
  }
}

ในตัวอย่างนี้ fullName เป็นคุณสมบัติ computed ที่ขึ้นอยู่กับ firstName และ lastName เมื่อใดก็ตามที่ firstName หรือ lastName เปลี่ยนแปลง fullName จะถูกอัปเดตโดยอัตโนมัติ

4. Watchers ด้วย watch และ watchEffect

Watchers ช่วยให้คุณสามารถตอบสนองต่อการเปลี่ยนแปลงในสถานะ reactive Composition API มีสองวิธีหลักในการสร้าง watchers คือ watch และ watchEffect

ตัวอย่างการใช้ watch:

import { ref, watch } from 'vue'

export default {
  setup() {
    const count = ref(0)

    watch(
      count,
      (newValue, oldValue) => {
        console.log(`Count changed from ${oldValue} to ${newValue}`)
      }
    )

    const increment = () => {
      count.value++
    }

    return {
      count,
      increment
    }
  }
}

ตัวอย่างการใช้ watchEffect:

import { ref, watchEffect } from 'vue'

export default {
  setup() {
    const message = ref('Hello')

    watchEffect(() => {
      console.log(`Message is: ${message.value}`)
    })

    const updateMessage = (newMessage) => {
      message.value = newMessage
    }

    return {
      message,
      updateMessage
    }
  }
}

5. Lifecycle Hooks

Composition API ให้การเข้าถึง lifecycle hooks ของคอมโพเนนต์ผ่านฟังก์ชันที่ขึ้นต้นด้วย on เช่น onMounted, onUpdated และ onUnmounted ฟังก์ชันเหล่านี้รับ callback เป็นอาร์กิวเมนต์ ซึ่งจะถูกเรียกใช้งานเมื่อ lifecycle hook ที่สอดคล้องกันถูกทริกเกอร์

ตัวอย่าง:

import { onMounted, onUnmounted } from 'vue'

export default {
  setup() {
    onMounted(() => {
      console.log('Component is mounted')
    })

    onUnmounted(() => {
      console.log('Component is unmounted')
    })

    return {}
  }
}

การสร้างฟังก์ชัน Composable

พลังที่แท้จริงของ Composition API มาจากความสามารถในการสร้างฟังก์ชัน composable ที่นำกลับมาใช้ใหม่ได้ ฟังก์ชัน composable คือฟังก์ชันที่ห่อหุ้มส่วนของตรรกะคอมโพเนนต์และส่งคืนสถานะ reactive และฟังก์ชันที่สามารถใช้ได้ในหลายคอมโพเนนต์

ตัวอย่าง: เรามาสร้างฟังก์ชัน composable ที่ติดตามตำแหน่งของเมาส์กัน:

import { ref, onMounted, onUnmounted } from 'vue'

export function useMousePosition() {
  const x = ref(0)
  const y = ref(0)

  const updatePosition = (event) => {
    x.value = event.clientX
    y.value = event.clientY
  }

  onMounted(() => {
    window.addEventListener('mousemove', updatePosition)
  })

  onUnmounted(() => {
    window.removeEventListener('mousemove', updatePosition)
  })

  return {
    x,
    y
  }
}

ตอนนี้ คุณสามารถใช้ฟังก์ชัน composable นี้ในคอมโพเนนต์ใดก็ได้:

import { useMousePosition } from './useMousePosition'

export default {
  setup() {
    const { x, y } = useMousePosition()

    return {
      x,
      y
    }
  }
}

ตัวอย่างการใช้งานจริง

เรามาดูตัวอย่างการใช้งานจริงของ Composition API ในสถานการณ์ต่างๆ กัน:

1. การดึงข้อมูล (Data Fetching)

การสร้างฟังก์ชัน composable สำหรับดึงข้อมูลจาก API เป็นกรณีการใช้งานที่พบบ่อย ซึ่งช่วยให้คุณสามารถนำตรรกะการดึงข้อมูลเดียวกันกลับมาใช้ใหม่ในหลายคอมโพเนนต์ได้

import { ref, onMounted } from 'vue'

export function useFetch(url) {
  const data = ref(null)
  const error = ref(null)
  const loading = ref(true)

  onMounted(async () => {
    try {
      const response = await fetch(url)
      data.value = await response.json()
    } catch (err) {
      error.value = err
    } finally {
      loading.value = false
    }
  })

  return {
    data,
    error,
    loading
  }
}

จากนั้นคุณสามารถใช้ฟังก์ชัน composable นี้ในคอมโพเนนต์ของคุณได้ดังนี้:

import { useFetch } from './useFetch'

export default {
  setup() {
    const { data, error, loading } = useFetch('https://api.example.com/data')

    return {
      data,
      error,
      loading
    }
  }
}

2. การตรวจสอบความถูกต้องของฟอร์ม (Form Validation)

การตรวจสอบความถูกต้องของฟอร์มเป็นอีกหนึ่งส่วนที่ Composition API มีประโยชน์อย่างมาก คุณสามารถสร้างฟังก์ชัน composable ที่ห่อหุ้มตรรกะการตรวจสอบและนำกลับมาใช้ใหม่ในฟอร์มต่างๆ ได้

import { ref } from 'vue'

export function useValidation() {
  const errors = ref({})

  const validateField = (fieldName, value, rules) => {
    let error = null
    for (const rule of rules) {
      if (rule === 'required' && !value) {
        error = 'This field is required'
        break
      } else if (rule === 'email' && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value)) {
        error = 'Invalid email format'
        break
      }
    }

    if (error) {
      errors.value[fieldName] = error
    } else {
      delete errors.value[fieldName]
    }
  }

  return {
    errors,
    validateField
  }
}

การใช้งานในคอมโพเนนต์:

import { useValidation } from './useValidation'
import { ref } from 'vue'

export default {
  setup() {
    const { errors, validateField } = useValidation()
    const email = ref('')

    const validateEmail = () => {
      validateField('email', email.value, ['required', 'email'])
    }

    return {
      email,
      errors,
      validateEmail
    }
  }
}

3. การจัดการการยืนยันตัวตนผู้ใช้

ตรรกะการยืนยันตัวตนมักจะซับซ้อนและถูกทำซ้ำในหลายคอมโพเนนต์ Composition API ช่วยให้คุณสร้างฟังก์ชัน composable ที่ห่อหุ้มตรรกะการยืนยันตัวตนทั้งหมดและมี API ที่สะอาดให้คอมโพเนนต์ของคุณใช้งาน

ตัวอย่าง: (แบบง่าย)

import { ref } from 'vue'

export function useAuth() {
  const isLoggedIn = ref(false)
  const user = ref(null)

  const login = async (username, password) => {
    // Simulate API call
    await new Promise(resolve => setTimeout(resolve, 1000))
    isLoggedIn.value = true
    user.value = { username }
  }

  const logout = async () => {
    // Simulate API call
    await new Promise(resolve => setTimeout(resolve, 1000))
    isLoggedIn.value = false
    user.value = null
  }

  return {
    isLoggedIn,
    user,
    login,
    logout
  }
}

แนวทางปฏิบัติที่ดีที่สุดสำหรับการใช้ Composition API

เพื่อให้ได้ประโยชน์สูงสุดจาก Composition API ให้พิจารณาแนวทางปฏิบัติที่ดีที่สุดต่อไปนี้:

ข้อผิดพลาดที่พบบ่อยและวิธีหลีกเลี่ยง

แม้ว่า Composition API จะมีประโยชน์มากมาย แต่ก็มีข้อผิดพลาดที่พบบ่อยบางประการที่ควรระวัง:

Composition API กับทีมพัฒนาระดับโลก

Composition API ส่งเสริมความร่วมมือภายในทีมพัฒนาระดับโลกโดยการส่งเสริม:

สรุป

Vue.js 3 Composition API เป็นเครื่องมือที่ทรงพลังซึ่งสามารถปรับปรุงการจัดระเบียบ ความสามารถในการนำกลับมาใช้ใหม่ และความสามารถในการทดสอบของแอปพลิเคชัน Vue ของคุณได้อย่างมาก ด้วยการทำความเข้าใจแนวคิดหลักและปฏิบัติตามแนวทางปฏิบัติที่ดีที่สุดที่ระบุไว้ในบทความเจาะลึกนี้ คุณสามารถใช้ประโยชน์จาก Composition API เพื่อสร้างแอปพลิเคชันที่ดูแลรักษาง่ายและปรับขนาดได้สำหรับผู้ชมทั่วโลก จงยอมรับ Composition API และปลดล็อกศักยภาพสูงสุดของ Vue.js 3

เราขอแนะนำให้คุณทดลองใช้ Composition API ในโปรเจกต์ของคุณเองและสำรวจความเป็นไปได้มากมายที่มันมอบให้ ขอให้มีความสุขกับการเขียนโค้ด!