0Pricing
Vue Academy · บทเรียน

Props และ Emits แบบมีชนิดด้วย defineProps/defineEmits

Generic defineProps (), ชนิดข้อมูลที่ซับซ้อน props ที่ไม่บังคับ และการกำหนดชนิดของ emit

Props และ Emits แบบมีชนิดด้วย defineProps/defineEmits เป็นบทเรียน Vue Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Vue Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Vue Academy มีบทเรียนทั้งหมด 4 บทเรียน

การกำหนดชนิดข้อมูลอินพุตและเอาต์พุตของคอมโพเนนต์

เมื่อใช้ lang="ts" มาโคร defineProps และ defineEmits จะรับชนิดข้อมูล TypeScript ได้โดยตรง ทำให้ตรวจสอบข้อมูลที่ไหลเข้าและออกจากคอมโพเนนต์ได้ตั้งแต่เวลาคอมไพล์

Props จากอินเทอร์เฟซ

ส่งชนิดข้อมูลให้กับพารามิเตอร์ทั่วไปของ defineProps การใช้ อินเทอร์เฟซ ช่วยให้โครงสร้าง props ที่ซับซ้อนอ่านง่ายและนำกลับมาใช้ใหม่ได้

<script setup lang="ts">
interface Props {
  title: string
  count: number
}
const props = defineProps<Props>()
</script>

ชนิดข้อมูลออบเจ็กต์แบบเขียนในบรรทัดเดียว

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

<script setup lang="ts">
const props = defineProps<{
  label: string
  disabled: boolean
}>()
</script>

พร็อพเพอร์ตีเสริมด้วย ?

ทำเครื่องหมายพร็อพเพอร์ตีว่าเป็นตัวเลือกเสริมด้วย ? props แบบเสริมจะมีชนิดข้อมูลเป็น T | undefined และคอมโพเนนต์แม่อาจไม่ส่งค่าเหล่านี้มาได้

<script setup lang="ts">
interface Props {
  title: string
  subtitle?: string
}
const props = defineProps<Props>()
</script>

ชนิดข้อมูลของ Props ที่ซับซ้อน

Props อาจเป็นอาร์เรย์ ยูเนียน หรือโครงสร้างออบเจ็กต์ก็ได้ กล่าวคือเป็นอะไรก็ตามที่ TypeScript สามารถแสดงได้

<script setup lang="ts">
interface Props {
  items: string[]
  size: 'sm' | 'md' | 'lg'
  user: { id: number; name: string }
}
const props = defineProps<Props>()
</script>

ค่าเริ่มต้นด้วย withDefaults

รูปแบบที่ระบุเฉพาะชนิดข้อมูลไม่สามารถเก็บค่าเริ่มต้นได้ จึงต้องครอบด้วย withDefaults อาร์กิวเมนต์ตัวที่สองจะจับคู่ชื่อ prop กับค่าเริ่มต้น

<script setup lang="ts">
const props = withDefaults(defineProps<{
  size?: string
  count?: number
}>(), {
  size: 'md',
  count: 0
})
</script>

ค่าเริ่มต้นสำหรับออบเจ็กต์และอาร์เรย์

ค่าเริ่มต้นของออบเจ็กต์และอาร์เรย์ต้องส่งกลับจากฟังก์ชันสร้าง เช่นเดียวกับใน Options API เพื่อหลีกเลี่ยงการใช้อินสแตนซ์เดียวร่วมกันระหว่างคอมโพเนนต์

withDefaults(defineProps<{
  tags?: string[]
}>(), {
  tags: () => []
})

การประกาศอีเวนต์ที่มีชนิดข้อมูล

defineEmits สามารถรับชนิดข้อมูลที่แสดงรายการอีเวนต์แต่ละรายการและข้อมูลที่ส่งไปพร้อมอีเวนต์ในรูปแบบลายเซ็นการเรียกใช้ได้ วิธีนี้จะตรวจจับชนิดข้อมูลของข้อมูลที่ส่งผิดตั้งแต่เวลาคอมไพล์

<script setup lang="ts">
const emit = defineEmits<{
  (e: 'change', value: string): void
  (e: 'delete', id: number): void
}>()
</script>

การส่งข้อมูลที่มีชนิดข้อมูล

ตอนนี้ emit จะยอมรับเฉพาะชื่ออีเวนต์ที่ถูกต้องและชนิดข้อมูลของข้อมูลที่ส่งที่ตรงกันเท่านั้น หากส่งตัวเลขในตำแหน่งที่คาดว่าจะเป็นสตริง จะเกิดข้อผิดพลาดในการคอมไพล์

function rename(name: string) {
  emit('change', name) // ok
  // emit('change', 123) // type error
}

ไวยากรณ์ทูเพิลแบบระบุชื่อ

Vue 3.3+ รองรับรูปแบบออบเจ็กต์แบบย่อ โดยแต่ละอีเวนต์จะจับคู่กับทูเพิลของชนิดข้อมูลอาร์กิวเมนต์ ซึ่งสะอาดกว่าลายเซ็นการเรียกใช้

<script setup lang="ts">
const emit = defineEmits<{
  change: [value: string]
  delete: [id: number]
}>()
</script>

Props และอีเวนต์ร่วมกัน

คอมโพเนนต์ที่มีชนิดข้อมูลโดยทั่วไปจะประกาศทั้งสองอย่าง ได้แก่ อินพุตผ่าน defineProps และเอาต์พุตผ่าน defineEmits โดยตรวจสอบได้ตลอดทั้งเส้นทาง

<script setup lang="ts">
defineProps<{ modelValue: string }>()
const emit = defineEmits<{
  'update:modelValue': [value: string]
}>()
</script>

ตรวจสอบอย่างรวดเร็ว

ทดสอบความรู้เกี่ยวกับ props และอีเวนต์ที่มีชนิดข้อมูล

สรุปทบทวน

คุณได้เรียนรู้เรื่องอินพุตและเอาต์พุตของคอมโพเนนต์ที่มีชนิดข้อมูล:

  • ส่งอินเทอร์เฟซหรือชนิดข้อมูลแบบเขียนในบรรทัดเดียวให้ defineProps<T>()
  • ใช้ ? สำหรับ props แบบเสริม และใช้ withDefaults สำหรับค่าเริ่มต้น (ใช้ฟังก์ชันสร้างสำหรับออบเจ็กต์/อาร์เรย์)
  • defineEmits<T>() กำหนดชนิดข้อมูลของชื่ออีเวนต์และข้อมูลที่ส่ง
  • รูปแบบทูเพิล (event: [payload]) เป็นไวยากรณ์แบบย่อสมัยใหม่

คำถามที่พบบ่อย

บทเรียน “Props และ Emits แบบมีชนิดด้วย defineProps/defineEmits” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “Props และ Emits แบบมีชนิดด้วย defineProps/defineEmits” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Vue Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Vue Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “Props และ Emits แบบมีชนิดด้วย defineProps/defineEmits”

Generic defineProps (), ชนิดข้อมูลที่ซับซ้อน props ที่ไม่บังคับ และการกำหนดชนิดของ emit คุณปฏิบัติ Vue Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Vue Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Vue Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “Props และ Emits แบบมีชนิดด้วย defineProps/defineEmits” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Vue Academy นี้ได้ไหม

ได้ บทเรียน Vue Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การตั้งค่า TypeScript ในโปรเจกต์ Vue
  2. Props และ Emits แบบมีชนิดด้วย defineProps/defineEmits
  3. การกำหนดชนิดให้คอมโพสิเบิลและรีฟ
  4. คอมโพเนนต์ Vue แบบ Generic
← กลับไปที่ Vue Academy