1
- import React , { useState , useContext , useMemo } from 'react'
1
+ import React , {
2
+ useState ,
3
+ useContext ,
4
+ useEffect ,
5
+ createRef
6
+ } from 'react'
2
7
import PropTypes from 'prop-types'
3
8
import classNames from 'classnames'
4
9
import { CIconRaw } from '@coreui/icons-react'
@@ -22,7 +27,6 @@ export const iconProps = (icon) => {
22
27
}
23
28
24
29
//component - CoreUI / CSidebarNavDropdown
25
-
26
30
const CSidebarNavDropdown = props => {
27
31
28
32
const {
@@ -38,21 +42,22 @@ const CSidebarNavDropdown = props => {
38
42
...attributes
39
43
} = props
40
44
41
- const key = useState ( Math . random ( ) . toString ( 36 ) . substr ( 2 ) ) [ 0 ]
45
+ const ref = createRef ( )
46
+ innerRef && innerRef ( ref )
42
47
43
48
const { dropdownMode, openDropdown, setOpenDropdown } = useContext ( Context )
44
49
45
50
const [ isOpen , setIsOpen ] = useState ( show )
46
- useMemo ( ( ) => {
51
+ useEffect ( ( ) => {
47
52
setIsOpen ( show )
48
53
} , [ show ] )
49
54
50
- useMemo ( ( ) => {
51
- ! dropdownMode && openDropdown !== key && setIsOpen ( false )
55
+ useEffect ( ( ) => {
56
+ ! dropdownMode && ( ! openDropdown || ! ref . current . contains ( openDropdown ) ) && setIsOpen ( false )
52
57
} , [ openDropdown ] )
53
58
54
59
const toggle = ( ) => {
55
- ! dropdownMode && setOpenDropdown ( isOpen ? null : key )
60
+ ! dropdownMode && setOpenDropdown ( isOpen ? null : ref . current )
56
61
setIsOpen ( ! isOpen )
57
62
}
58
63
@@ -61,7 +66,7 @@ const CSidebarNavDropdown = props => {
61
66
path = useLocation ( ) . pathname
62
67
} catch ( e ) { }
63
68
64
- useMemo ( ( ) => {
69
+ useEffect ( ( ) => {
65
70
if ( dropdownMode === 'close' ) {
66
71
setIsOpen ( false )
67
72
} else if ( dropdownMode === 'closeInactive' && route ) {
@@ -73,7 +78,6 @@ const CSidebarNavDropdown = props => {
73
78
74
79
75
80
//render
76
-
77
81
const classes = classNames (
78
82
'c-sidebar-nav-dropdown' ,
79
83
isOpen && 'c-show' ,
@@ -86,7 +90,11 @@ const CSidebarNavDropdown = props => {
86
90
)
87
91
88
92
return (
89
- < li className = { classes } { ...attributes } ref = { innerRef } >
93
+ < li
94
+ className = { classes }
95
+ { ...attributes }
96
+ ref = { ref }
97
+ >
90
98
< a className = "c-sidebar-nav-dropdown-toggle" onClick = { toggle } >
91
99
{ icon && < CIconRaw { ...iconProps ( icon ) } /> }
92
100
{ fontIcon && < i className = { iconClasses } /> }
0 commit comments