Giới thiệu slot và scoped slots trong Vue.js

Tram Ho

Chắc hẳn trong quá trình làm việc với Vue.js, các bạn sẽ gặp những trường hợp muốn chèn nội dụng HTML vào bên trong component con giống như cách chúng ta vẫn viết HTML thông thường thay vì dùng prop. Ví dụ như:

Để làm được việc này, Vue.js cung cấp <slot></slot> giúp chúng ta có thể chèn nội dung từ component cha vào component con.

Một số trường hợp thường sử dụng slot đó là:

  • Những component chung (Button, Modal, Card, Dropdown, Tabs, …)
  • Những component layout dùng chung (Header, Navbar, Footer…)
  • Những component đệ quy (Tree, Menu…)

Các loại slot

Căn bản

Cùng tìm hiểu cách dùng căn bản của slot. Chúng ta có component con childsử dụng slot như sau:

Component cha chèn nội dung vào bên trong child

Nội dung sau khi render ra như sau:

Fallback content

Tất cả nội dung bên trong <slot></slot> sẽ được dùng làm fallback content khi component cha không chèn bất kì thứ gì vào component con. Ví dụ:

Component cha gọi tới child nhưng không chèn nội dung vào:

Kết quả khi render ra sẽ hiển thị nội dung fallback:

Đặt tên cho Slot

Slot có một thuộc tính đặc biệt là name giúp chúng ta có thể đặt tên cho slot đó. Trong một component có thể chứa nhiều slot với tên khác nhau và Vue.js cũng cho phép có một slot không được đặt tên để chứa những nội dung không trùng khớp với bất kì slot name nào trong component. Chúng ta cùng xem qua ví dụ cho dễ hiểu.

Ta có một componet card gồm 3 phần header, content, footer Ta sẽ đặt vào 3 slot như sau:

Component cha sử dụng và truyền nội dung:

Kết quả sau khi render:

Scoped slots

Scoped slots là một loại đặt biệt của slot giúp bạn có thể truyền dữ liệu từ component con lên component cha thông qua việc gán dữ liệu thông qua thuộc tính (nó cũng tương tự việc đưa dữ liệu vào props của component). Chúng ta cùng xem qua ví dụ:

Mình có một child như sau:

Như các bạn thấy, mình truyền vào slot một attribute là text kiểu như prop bạn thường thấy khi truyền vào component.

Tiếp theo đến component cha. Chúng ta sẽ lấy nội dung từ text thông qua thuộc tính slot-scope.

Những kiểu dữ liệu có thể sử dụng trong scoped slots có thể là string, number, object, array thậm chí bạn có thể truyền method.

Tổng kết

  • Slot và Scoped slot là một trong những tính năng mạnh mẽ nhất của Vuejs. Nó cho phép chúng ta có khả năng tùy biến các component với việc viết ít mã, code có thể tái sử dụng, giúp clean code và tránh vi phạm nguyên tắc DRY. Cám ơn các bạn đã theo dõi!
  • Tham khảo: Trang chủ
Chia sẻ bài viết ngay

Nguồn bài viết : Viblo