1- import React , { useState , useContext , useMemo } from 'react'
1+ import React , {
2+ useState ,
3+ useContext ,
4+ useEffect ,
5+ createRef
6+ } from 'react'
27import PropTypes from 'prop-types'
38import classNames from 'classnames'
49import { CIconRaw } from '@coreui/icons-react'
@@ -22,7 +27,6 @@ export const iconProps = (icon) => {
2227}
2328
2429//component - CoreUI / CSidebarNavDropdown
25-
2630const CSidebarNavDropdown = props => {
2731
2832 const {
@@ -38,21 +42,22 @@ const CSidebarNavDropdown = props => {
3842 ...attributes
3943 } = props
4044
41- const key = useState ( Math . random ( ) . toString ( 36 ) . substr ( 2 ) ) [ 0 ]
45+ const ref = createRef ( )
46+ innerRef && innerRef ( ref )
4247
4348 const { dropdownMode, openDropdown, setOpenDropdown } = useContext ( Context )
4449
4550 const [ isOpen , setIsOpen ] = useState ( show )
46- useMemo ( ( ) => {
51+ useEffect ( ( ) => {
4752 setIsOpen ( show )
4853 } , [ show ] )
4954
50- useMemo ( ( ) => {
51- ! dropdownMode && openDropdown !== key && setIsOpen ( false )
55+ useEffect ( ( ) => {
56+ ! dropdownMode && ( ! openDropdown || ! ref . current . contains ( openDropdown ) ) && setIsOpen ( false )
5257 } , [ openDropdown ] )
5358
5459 const toggle = ( ) => {
55- ! dropdownMode && setOpenDropdown ( isOpen ? null : key )
60+ ! dropdownMode && setOpenDropdown ( isOpen ? null : ref . current )
5661 setIsOpen ( ! isOpen )
5762 }
5863
@@ -61,7 +66,7 @@ const CSidebarNavDropdown = props => {
6166 path = useLocation ( ) . pathname
6267 } catch ( e ) { }
6368
64- useMemo ( ( ) => {
69+ useEffect ( ( ) => {
6570 if ( dropdownMode === 'close' ) {
6671 setIsOpen ( false )
6772 } else if ( dropdownMode === 'closeInactive' && route ) {
@@ -73,7 +78,6 @@ const CSidebarNavDropdown = props => {
7378
7479
7580 //render
76-
7781 const classes = classNames (
7882 'c-sidebar-nav-dropdown' ,
7983 isOpen && 'c-show' ,
@@ -86,7 +90,11 @@ const CSidebarNavDropdown = props => {
8690 )
8791
8892 return (
89- < li className = { classes } { ...attributes } ref = { innerRef } >
93+ < li
94+ className = { classes }
95+ { ...attributes }
96+ ref = { ref }
97+ >
9098 < a className = "c-sidebar-nav-dropdown-toggle" onClick = { toggle } >
9199 { icon && < CIconRaw { ...iconProps ( icon ) } /> }
92100 { fontIcon && < i className = { iconClasses } /> }
0 commit comments