Skip to content

CSideNav

Menu điều hướng sidebar, sinh từ một mảng cấu hình. Tự tô sáng mục đang mở và tự mở nhóm cha chứa mục đó.

Dùng khi: tự dựng layout riêng cho dự án. App bình thường không gọi component này — layer đã lắp sẵn trong layout mặc định, dự án chỉ khai nav trong app.config.ts, xem Khung giao diện.

Cấu hình NavItem

ts
import { h } from 'vue'
import { IconHome } from '@tabler/icons-vue'
import type { NavItem } from '@tasco/ui'

const items: NavItem[] = [
  { label: 'Trang chủ', path: '/', icon: () => h(IconHome, { size: 18 }) },
  {
    label: 'Báo cáo',
    children: [
      { label: 'Doanh thu', path: '/reports/revenue', permission: '/reports/revenue' },
    ],
  },
]
FieldÝ nghĩa
labelNhãn hiển thị (bắt buộc)
pathĐường dẫn; nhóm cha có children thì bỏ trống
iconRender function: () => h(IconHome, { size: 18 })
childrenMenu con một cấp
permissionURI quyền — component không tự lọc, xem mục dưới
keyKhoá riêng; mặc định suy từ path/label

Mục đang mở

active-path quyết định mục nào sáng: component chọn item lá có pathtiền tố dài nhất của active-path. Nhờ vậy /orders/DH-0001 vẫn làm sáng mục /orders, và mục / không chiếm chỗ của mọi đường dẫn khác.

Trong app Nuxt: :active-path="route.path".

Điều hướng

Component không biết router: bấm mục có path chỉ phát @navigate(path).

vue
<CSideNav :items="items" :active-path="route.path" @navigate="navigateTo" />

Lọc theo quyền

CSideNav hiển thị đúng những gì nhận được — lọc là việc của lớp gọi:

ts
const { filterByPermission } = usePermission()
const nav = computed(() => filterByPermission(items))

Layout mặc định của layer đã làm sẵn bước này. Xem Chặn theo quyền.

Thu gọn

collapsed chuyển menu về chế độ chỉ còn icon (rộng 64px). Mục không có icon sẽ gần như không nhận ra được ở chế độ này — khai icon cho mọi mục cấp một.

API

Props

TênKiểuMặc địnhMô tả
items*NavItem[]Cây menu; `icon` là render function của component icon.
activePathstring''Đường dẫn hiện tại để tô sáng item đúng.
collapsedbooleanfalseChế độ thu gọn: chỉ còn icon.

Sự kiện

TênPayloadMô tả
navigate[path: string]Bấm item có `path` — router-agnostic, layer gọi navigateTo.

Khả năng tiếp cận

  • Menu render bằng a-menu của antd: điều hướng được bằng phím mũi tên, Enter để mở mục.
  • Ở chế độ thu gọn, nhãn hiện qua tooltip của antd — vẫn đọc được bằng trình đọc màn hình.
  • Icon là trang trí; nhãn chữ mới là thông tin. Đừng bỏ label để chỉ còn icon.

Lưu ý

  • Chỉ hỗ trợ một cấp menu con. Cây sâu hơn là dấu hiệu nên tách module, không phải nên lồng thêm.
  • icon: IconHome (truyền thẳng component) sẽ không hiển thị đúng — phải là render function.
  • Nhiều mục cùng path thì mục nào cũng có thể sáng: đặt key riêng để tránh nhập nhằng.

Liên quan