Skip to content

Commit 147e057

Browse files
ProcessMonitortangly1024
authored andcommitted
fix(proxio): dropdown menu overlap and blur behavior (notionnext-org#3937)
Partial merge from PR notionnext-org#3937: MenuItem.js and MenuList.js only; excludes blog.config, theme config, and yarn.lock. Made-with: Cursor
1 parent 048dd7b commit 147e057

2 files changed

Lines changed: 34 additions & 6 deletions

File tree

themes/proxio/components/MenuItem.js

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,23 @@ import { useState } from 'react'
77
* @param {*} param0
88
* @returns
99
*/
10-
export const MenuItem = ({ link }) => {
10+
export const MenuItem = ({ link, isOpen, toggleOpen }) => {
1111
const hasSubMenu = link?.subMenus?.length > 0
1212
const router = useRouter()
1313

1414
// 管理子菜单的展开状态
1515
const [isSubMenuOpen, setIsSubMenuOpen] = useState(false)
1616

1717
const toggleSubMenu = () => {
18-
setIsSubMenuOpen(prev => !prev) // 切换子菜单状态
18+
if (toggleOpen) {
19+
toggleOpen()
20+
} else {
21+
setIsSubMenuOpen(prev => !prev) // 切换子菜单状态
22+
}
1923
}
2024

25+
const open = isOpen !== undefined ? isOpen : isSubMenuOpen
26+
2127
return (
2228
<>
2329
{/* 普通 MenuItem */}
@@ -66,7 +72,7 @@ export const MenuItem = ({ link }) => {
6672
{/* 子菜单 */}
6773
<div
6874
className={`submenu dark:border-gray-600 relative left-0 top-full w-[250px] rounded-sm bg-white p-4 transition-all duration-300 dark:bg-dark-2 lg:absolute lg:shadow-lg ${
69-
isSubMenuOpen
75+
open
7076
? 'block opacity-100 visible'
7177
: 'hidden opacity-0 invisible'
7278
}`}>

themes/proxio/components/MenuList.js

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import BLOG from '@/blog.config'
22
import { siteConfig } from '@/lib/config'
33
import { useGlobal } from '@/lib/global'
44
import { useRouter } from 'next/router'
5-
import { useEffect, useState } from 'react'
5+
import { useEffect, useState, useRef } from 'react'
66
import { MenuItem } from './MenuItem'
77

88
/**
@@ -13,7 +13,10 @@ export const MenuList = props => {
1313
const { locale } = useGlobal()
1414

1515
const [showMenu, setShowMenu] = useState(false) // 控制菜单展开/收起状态
16+
const [openSubMenuIdx, setOpenSubMenuIdx] = useState(null) // 控制哪个子菜单处于展开状态
1617
const router = useRouter()
18+
const menuRef = useRef(null) // 监听点击外部区域
19+
1720

1821
let links = [
1922
{
@@ -57,14 +60,28 @@ export const MenuList = props => {
5760

5861
useEffect(() => {
5962
setShowMenu(false)
63+
setOpenSubMenuIdx(null)
6064
}, [router])
6165

66+
// 监听点击外部区域,收起子菜单
67+
useEffect(() => {
68+
const handleClickOutside = (event) => {
69+
if (menuRef.current && !menuRef.current.contains(event.target)) {
70+
setOpenSubMenuIdx(null)
71+
}
72+
}
73+
document.addEventListener('mousedown', handleClickOutside)
74+
return () => {
75+
document.removeEventListener('mousedown', handleClickOutside)
76+
}
77+
}, [])
78+
6279
if (!links || links.length === 0) {
6380
return null
6481
}
6582

6683
return (
67-
<div>
84+
<div ref={menuRef}>
6885
{/* 移动端菜单切换按钮 */}
6986
<button
7087
id='navbarToggler'
@@ -84,7 +101,12 @@ export const MenuList = props => {
84101
}`}>
85102
<ul className='blcok lg:flex 2xl:ml-20'>
86103
{links?.map((link, index) => (
87-
<MenuItem key={index} link={link} />
104+
<MenuItem
105+
key={index}
106+
link={link}
107+
isOpen={openSubMenuIdx === index}
108+
toggleOpen={() => setOpenSubMenuIdx(openSubMenuIdx === index ? null : index)}
109+
/>
88110
))}
89111
</ul>
90112
</nav>

0 commit comments

Comments
 (0)