mirror of
https://github.com/nagisa77/OpenIsle.git
synced 2026-05-10 20:57:28 +08:00
menu追加选中状态
This commit is contained in:
@@ -86,6 +86,7 @@
|
|||||||
v-for="c in categoryData"
|
v-for="c in categoryData"
|
||||||
:key="c.id"
|
:key="c.id"
|
||||||
class="section-item"
|
class="section-item"
|
||||||
|
:class="{ selected: isCategorySelected(c.id) }"
|
||||||
@click="gotoCategory(c)"
|
@click="gotoCategory(c)"
|
||||||
>
|
>
|
||||||
<template v-if="c.smallIcon || c.icon">
|
<template v-if="c.smallIcon || c.icon">
|
||||||
@@ -115,7 +116,14 @@
|
|||||||
<div v-if="isLoadingTag" class="menu-loading-container">
|
<div v-if="isLoadingTag" class="menu-loading-container">
|
||||||
<l-hatch size="28" stroke="4" speed="3.5" color="var(--primary-color)"></l-hatch>
|
<l-hatch size="28" stroke="4" speed="3.5" color="var(--primary-color)"></l-hatch>
|
||||||
</div>
|
</div>
|
||||||
<div v-else v-for="t in tagData" :key="t.id" class="section-item" @click="gotoTag(t)">
|
<div
|
||||||
|
v-else
|
||||||
|
v-for="t in tagData"
|
||||||
|
:key="t.id"
|
||||||
|
class="section-item"
|
||||||
|
:class="{ selected: isTagSelected(t.id) }"
|
||||||
|
@click="gotoTag(t)"
|
||||||
|
>
|
||||||
<BaseImage
|
<BaseImage
|
||||||
v-if="isImageIcon(t.smallIcon || t.icon)"
|
v-if="isImageIcon(t.smallIcon || t.icon)"
|
||||||
:src="t.smallIcon || t.icon"
|
:src="t.smallIcon || t.icon"
|
||||||
@@ -154,8 +162,21 @@ import { authState, fetchCurrentUser } from '~/utils/auth'
|
|||||||
import { fetchUnreadCount, notificationState } from '~/utils/notification'
|
import { fetchUnreadCount, notificationState } from '~/utils/notification'
|
||||||
import { useIsMobile } from '~/utils/screen'
|
import { useIsMobile } from '~/utils/screen'
|
||||||
import { cycleTheme, ThemeMode, themeState } from '~/utils/theme'
|
import { cycleTheme, ThemeMode, themeState } from '~/utils/theme'
|
||||||
|
import { selectedCategoryGlobal, selectedTagsGlobal } from '~/composables/postFilter'
|
||||||
|
|
||||||
const isMobile = useIsMobile()
|
const isMobile = useIsMobile()
|
||||||
|
// 判断当前分类是否被选中
|
||||||
|
const isCategorySelected = (id) => {
|
||||||
|
return id === selectedCategoryGlobal.value
|
||||||
|
}
|
||||||
|
|
||||||
|
// 判断当前标签是否被选中
|
||||||
|
const isTagSelected = (id) => {
|
||||||
|
const selected = Array.isArray(selectedTagsGlobal.value)
|
||||||
|
? selectedTagsGlobal.value
|
||||||
|
: [selectedTagsGlobal.value]
|
||||||
|
return selected.includes(id)
|
||||||
|
}
|
||||||
|
|
||||||
const config = useRuntimeConfig()
|
const config = useRuntimeConfig()
|
||||||
const API_BASE_URL = config.public.apiBaseUrl
|
const API_BASE_URL = config.public.apiBaseUrl
|
||||||
@@ -415,6 +436,11 @@ const gotoTag = (t) => {
|
|||||||
.section-item:hover {
|
.section-item:hover {
|
||||||
background-color: var(--menu-selected-background-color-hover);
|
background-color: var(--menu-selected-background-color-hover);
|
||||||
}
|
}
|
||||||
|
.section-item.selected {
|
||||||
|
font-weight: bold;
|
||||||
|
background-color: var(--menu-selected-background-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
.section-item-text-count {
|
.section-item-text-count {
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
|
|||||||
4
frontend_nuxt/composables/postFilter.ts
Normal file
4
frontend_nuxt/composables/postFilter.ts
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
import { ref } from 'vue'
|
||||||
|
// 全局存储选中的分类和标签
|
||||||
|
export const selectedCategoryGlobal = ref('')
|
||||||
|
export const selectedTagsGlobal = ref([])
|
||||||
@@ -139,6 +139,7 @@ import { getToken } from '~/utils/auth'
|
|||||||
import { stripMarkdown } from '~/utils/markdown'
|
import { stripMarkdown } from '~/utils/markdown'
|
||||||
import { useIsMobile } from '~/utils/screen'
|
import { useIsMobile } from '~/utils/screen'
|
||||||
import TimeManager from '~/utils/time'
|
import TimeManager from '~/utils/time'
|
||||||
|
import { selectedCategoryGlobal, selectedTagsGlobal } from '~/composables/postFilter'
|
||||||
useHead({
|
useHead({
|
||||||
title: 'OpenIsle - 全面开源的自由社区',
|
title: 'OpenIsle - 全面开源的自由社区',
|
||||||
meta: [
|
meta: [
|
||||||
@@ -204,6 +205,10 @@ onMounted(() => {
|
|||||||
if (saved) {
|
if (saved) {
|
||||||
selectedTopic.value = saved
|
selectedTopic.value = saved
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 和menu同步状态
|
||||||
|
selectedCategoryGlobal.value = selectedCategory.value
|
||||||
|
selectedTagsGlobal.value = selectedTags.value
|
||||||
})
|
})
|
||||||
|
|
||||||
/** 路由变更时同步筛选 **/
|
/** 路由变更时同步筛选 **/
|
||||||
@@ -372,6 +377,13 @@ const ioKey = computed(() => asyncKey.value.join('::'))
|
|||||||
|
|
||||||
/** 其他工具函数 **/
|
/** 其他工具函数 **/
|
||||||
const sanitizeDescription = (text) => stripMarkdown(text)
|
const sanitizeDescription = (text) => stripMarkdown(text)
|
||||||
|
|
||||||
|
// 页面选项同步到全局状态
|
||||||
|
watch([selectedCategory, selectedTags], ([newCategory, newTags]) => {
|
||||||
|
selectedCategoryGlobal.value = newCategory
|
||||||
|
selectedTagsGlobal.value = newTags
|
||||||
|
})
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
|
|||||||
Reference in New Issue
Block a user