Skip to content

API Styles (Hook vs Composibles)

ลักษณะHooks (React)Composables (Vue 3)
FrameworkReactVue 3
การใช้งานใช้สำหรับการจัดการ state และ side effects ใน functional componentsใช้สำหรับการจัดการ state และ logic ที่สามารถ reuse ได้ใน Composition API
การเรียกใช้เรียกใช้ภายใน functional componentsเรียกใช้ภายใน setup function ของ component
Prefixคำว่า "use" (เช่น useState, useEffect)ไม่มี prefix ที่ตายตัว แต่ควรมีชื่อสื่อความหมาย (เช่น useUser)
โครงสร้างมักจะเป็น functions ที่มี state และ logic รวมกันมักจะเป็น functions ที่แยก state และ logic เพื่อ reuse ได้ง่าย
Stateใช้ useState สำหรับการจัดการ stateใช้ reactive, ref หรือ reactive composition API เช่น reactive, ref, computed
Side Effectsใช้ useEffect สำหรับการจัดการ side effectsใช้ watch, watchEffect หรือ lifecycle hooks เช่น onMounted, onUnmounted
Lifecycle Hooksจัดการผ่าน useEffect ด้วย dependencies arrayจัดการผ่าน onMounted, onUnmounted, onUpdated ฯลฯ
การแชร์ Logicสร้าง custom hooks ที่สามารถนำมาใช้ซ้ำได้สร้าง composable functions ที่สามารถนำมาใช้ซ้ำได้
การจัดการ Contextใช้ useContext เพื่อเข้าถึง contextใช้ provide และ inject เพื่อจัดการ dependency injection
ความสามารถในการใช้งานร่วมกันHooks สามารถใช้งานร่วมกันใน functional components เท่านั้นComposables สามารถใช้งานร่วมกันได้ทั้งใน functional และ class-based components ผ่าน setup function
ตัวอย่าง

React Hooks

jsx
import { useState, useEffect } from 'react';

function useCounter() {
  const [count, setCount] = useState(0);

  useEffect(() => {
    const interval = setInterval(() => {
      setCount(prevCount => prevCount + 1);
    }, 1000);
    return () => clearInterval(interval);
  }, []);

  return count;
}

function Counter() {
  const count = useCounter();
  return <div>{count}</div>;
}

Vue 3 Composables

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

function useCounter() {
  const count = ref(0);

  onMounted(() => {
    const interval = setInterval(() => {
      count.value++;
    }, 1000);
    onUnmounted(() => clearInterval(interval));
  });

  return count;
}

export default {
  setup() {
    const count = useCounter();
    return { count };
  },
  template: '<div>{{ count }}</div>',
};

Released under the MIT License