refactor: update v-model bindings and emit event names for favorites and breadcrumb visibility

This commit is contained in:
skytek_xinliang
2026-03-27 15:35:36 +08:00
parent 2f1801bc2b
commit 24661a17b3
3 changed files with 15 additions and 18 deletions
+5 -8
View File
@@ -119,20 +119,17 @@
:is-mobile="isMobile" :is-mobile="isMobile"
:logout-label="logoutLabel" :logout-label="logoutLabel"
:search-config="searchConfig" :search-config="searchConfig"
:search-value="searchValue"
:breadcrumb-bar-visible="breadcrumbBarVisible"
:show-favorites-bar="showFavoritesBar"
:theme-toggle-label="themeToggleLabel" :theme-toggle-label="themeToggleLabel"
:toolbar-actions="toolbarActions" :toolbar-actions="toolbarActions"
:toolbar-counts="toolbarCounts" :toolbar-counts="toolbarCounts"
v-model:search-value="searchValue"
v-model:breadcrumb-bar-visible="breadcrumbBarVisible"
v-model:show-favorites-bar="showFavoritesBar"
@action="handleAction" @action="handleAction"
@logout="emitLogout" @logout="emitLogout"
@search="triggerSearch" @search="triggerSearch"
@toggle-drawer="drawer = !drawer" @toggle-drawer="drawer = !drawer"
@toggle-theme="toggleTheme" @toggle-theme="toggleTheme"
@update:search-value="searchValue = $event"
@update:breadcrumb-bar-visible="breadcrumbBarVisible = $event"
@update:show-favorites-bar="showFavoritesBar = $event"
> >
<template v-if="$slots.actions" #actions> <template v-if="$slots.actions" #actions>
<slot name="actions"></slot> <slot name="actions"></slot>
@@ -395,11 +392,11 @@ const {
toggleSidebar, toggleSidebar,
} = useAdminLayoutState({ } = useAdminLayoutState({
appBarRef, appBarRef,
breadcrumbBarVisible: props.breadcrumbBarVisible, breadcrumbBarVisible: toRef(props, 'breadcrumbBarVisible'),
emitUpdateBreadcrumbBarVisible: (value) => emit('update:breadcrumbBarVisible', value), emitUpdateBreadcrumbBarVisible: (value) => emit('update:breadcrumbBarVisible', value),
emitUpdateFavoritesBarVisible: (value) => emit('update:favoritesBarVisible', value), emitUpdateFavoritesBarVisible: (value) => emit('update:favoritesBarVisible', value),
emitUpdateIsRail: (value) => emit('update:isRail', value), emitUpdateIsRail: (value) => emit('update:isRail', value),
favoritesBarVisible: props.favoritesBarVisible, favoritesBarVisible: toRef(props, 'favoritesBarVisible'),
isMobile, isMobile,
isRail: toRef(props, 'isRail'), // 傳 Ref 確保 composable getter 能隨 prop 更新 isRail: toRef(props, 'isRail'), // 傳 Ref 確保 composable getter 能隨 prop 更新
menuItems: props.menuItems, menuItems: props.menuItems,
@@ -175,8 +175,8 @@ const emit = defineEmits<{
action: [type: AdminLayoutActionType] action: [type: AdminLayoutActionType]
logout: [] logout: []
'toggle-theme': [] 'toggle-theme': []
'update:showFavoritesBar': [value: boolean] 'update:show-favorites-bar': [value: boolean]
'update:breadcrumbBarVisible': [value: boolean] 'update:breadcrumb-bar-visible': [value: boolean]
}>() }>()
const searchValueModel = computed({ const searchValueModel = computed({
@@ -186,12 +186,12 @@ const searchValueModel = computed({
const showFavoritesBarModel = computed({ const showFavoritesBarModel = computed({
get: () => props.showFavoritesBar, get: () => props.showFavoritesBar,
set: (value) => emit('update:showFavoritesBar', value), set: (value) => emit('update:show-favorites-bar', value),
}) })
const breadcrumbBarVisibleModel = computed({ const breadcrumbBarVisibleModel = computed({
get: () => props.breadcrumbBarVisible, get: () => props.breadcrumbBarVisible,
set: (value) => emit('update:breadcrumbBarVisible', value), set: (value) => emit('update:breadcrumb-bar-visible', value),
}) })
function triggerSearch () { function triggerSearch () {
@@ -8,11 +8,11 @@ type ToggleSidebarPayload = {
type UseAdminLayoutStateOptions = { type UseAdminLayoutStateOptions = {
appBarRef: Ref<unknown> appBarRef: Ref<unknown>
breadcrumbBarVisible: boolean | null breadcrumbBarVisible: Ref<boolean | null>
emitUpdateBreadcrumbBarVisible: (value: boolean) => void emitUpdateBreadcrumbBarVisible: (value: boolean) => void
emitUpdateFavoritesBarVisible: (value: boolean) => void emitUpdateFavoritesBarVisible: (value: boolean) => void
emitUpdateIsRail: (value: boolean) => void emitUpdateIsRail: (value: boolean) => void
favoritesBarVisible: boolean | null favoritesBarVisible: Ref<boolean | null>
isMobile: Ref<boolean> isMobile: Ref<boolean>
isRail: Ref<boolean | null> // 必須為 Ref,確保父層 prop 更新時 getter 能即時反映 isRail: Ref<boolean | null> // 必須為 Ref,確保父層 prop 更新時 getter 能即時反映
menuItems: AdminLayoutMenuItem[] menuItems: AdminLayoutMenuItem[]
@@ -42,9 +42,9 @@ export function useAdminLayoutState(options: UseAdminLayoutStateOptions) {
}) })
const showFavoritesBar = computed({ const showFavoritesBar = computed({
get: () => options.favoritesBarVisible ?? localFavoritesBarVisible.value, get: () => options.favoritesBarVisible.value ?? localFavoritesBarVisible.value,
set: (value: boolean) => { set: (value: boolean) => {
if (options.favoritesBarVisible === null) { if (options.favoritesBarVisible.value === null) {
localFavoritesBarVisible.value = value localFavoritesBarVisible.value = value
return return
} }
@@ -54,9 +54,9 @@ export function useAdminLayoutState(options: UseAdminLayoutStateOptions) {
}) })
const breadcrumbBarVisible = computed({ const breadcrumbBarVisible = computed({
get: () => options.breadcrumbBarVisible ?? localBreadcrumbBarVisible.value, get: () => options.breadcrumbBarVisible.value ?? localBreadcrumbBarVisible.value,
set: (value: boolean) => { set: (value: boolean) => {
if (options.breadcrumbBarVisible === null) { if (options.breadcrumbBarVisible.value === null) {
localBreadcrumbBarVisible.value = value localBreadcrumbBarVisible.value = value
return return
} }