Tạo component tái sử dụng

Tạo bởi Hoàng Vũ, chỉnh sửa cuối lúc 18 tháng 4, 2025

Component là đơn vị xây dựng UI quan trọng trong bất kỳ ứng dụng Vue/Nuxt nào. Trong Nuxt 3, việc tạo và sử dụng component trở nên cực kỳ tiện lợi nhờ vào auto-import và khả năng tổ chức linh hoạt. Bài học này sẽ giúp bạn nắm được cách tạo component đơn giản, áp dụng các nguyên tắc thiết kế tái sử dụng, và thực hành với các component phổ biến như nút bấm, thẻ nội dung (card), và thông báo (alert).

Tạo component tái sử dụng

1. Cách tạo component mới trong thư mục components/

Tất cả component nên được đặt trong thư mục components/. Nuxt sẽ tự động nhận diện và import các file trong thư mục này (auto-import).

Ví dụ: tạo một nút tái sử dụng:

components/BaseButton.vue

<template>
  <button
    class="px-4 py-2 bg-blue-600 text-white rounded hover:bg-blue-700 transition"
    @click="$emit('click')"
  >
    <slot />
  </button>
</template>

Lưu ý: Component sẽ được tự động import, bạn không cần import BaseButton from ...

2. Các nguyên tắc viết component tái sử dụng

Để một component dễ tái sử dụng, cần tuân theo các nguyên tắc sau:

  • Tối ưu đầu vào (Props): Cho phép tùy biến nội dung, màu sắc, trạng thái...
  • Tối ưu đầu ra (Emit): Cho phép component gửi sự kiện ra ngoài (ví dụ: click, submit)
  • Dùng slot để truyền nội dung động
  • Tránh hardcode, sử dụng props mặc định hợp lý

Ví dụ cải tiến BaseButton với props:

<script setup>
defineProps({
  color: { type: String, default: 'blue' },
  size: { type: String, default: 'md' }
})
</script>

<template>
  <button
    :class="[
      'text-white rounded transition',
      color === 'blue' ? 'bg-blue-600 hover:bg-blue-700' : 'bg-gray-600 hover:bg-gray-700',
      size === 'sm' ? 'px-2 py-1 text-sm' : 'px-4 py-2 text-base'
    ]"
    @click="$emit('click')"
  >
    <slot />
  </button>
</template>

3. Thực hành: tạo các component phổ biến

a. Alert – Thông báo

components/BaseAlert.vue

<script setup>
defineProps({
  type: { type: String, default: 'info' }
})
</script>

<template>
  <div :class="{
    'p-4 rounded': true,
    'bg-blue-100 text-blue-800': type === 'info',
    'bg-red-100 text-red-800': type === 'error',
    'bg-green-100 text-green-800': type === 'success'
  }">
    <slot />
  </div>
</template>

b. Card – Thẻ nội dung

components/BaseCard.vue

<template>
  <div class="border rounded shadow-sm p-4 bg-white">
    <slot name="title" />
    <div class="mt-2">
      <slot />
    </div>
  </div>
</template>

Sử dụng trong page:

<BaseCard>
  <template #title>
    <h2 class="text-xl font-bold">Tiêu đề</h2>
  </template>
  Nội dung card đơn giản.
</BaseCard>

Kết luận bài học

Trong bài này, bạn đã học cách tạo component trong Nuxt 3, hiểu được cơ chế auto-import và cách tổ chức component hiệu quả. Bằng việc áp dụng các nguyên tắc tái sử dụng – như sử dụng props, emit và slot – bạn có thể xây dựng các UI thành phần linh hoạt, dễ bảo trì và sử dụng lại. Các ví dụ thực hành như nút bấm, alert và card là nền tảng để bạn mở rộng ra các component phức tạp hơn trong dự án thực tế.

Website Logo

Với hơn 10 năm kinh nghiệm lập trình web và từng làm việc với nhiều framework, ngôn ngữ như PHP, JavaScript, React, jQuery, CSS, HTML, CakePHP, Laravel..., tôi hy vọng những kiến thức được chia sẻ tại đây sẽ hữu ích và thiết thực cho các bạn.

Bình luận

Website Logo

Chào, tôi là Vũ. Đây là blog hướng dẫn lập trình của tôi.

Liên hệ công việc qua email dưới đây.

lhvuctu@gmail.com

Chúng Tôi Trên

Bạn đang muốn học về lập trình website?

Bạn cần nâng cao kiến thức chuyên nghiệp hơn để nâng cao cơ hội nghề nghiệp? Liên hệ