Skip to content

Commit a428643

Browse files
committed
refactor(CDropdown): prevent unnecessary re-render
1 parent 1442e13 commit a428643

File tree

1 file changed

+33
-30
lines changed

1 file changed

+33
-30
lines changed

packages/coreui-react/src/components/dropdown/CDropdown.tsx

Lines changed: 33 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import React, {
33
ElementType,
44
forwardRef,
55
HTMLAttributes,
6+
ReactNode,
67
RefObject,
78
useEffect,
89
useRef,
@@ -87,6 +88,16 @@ export interface CDropdownProps extends HTMLAttributes<HTMLDivElement | HTMLLIEl
8788
visible?: boolean
8889
}
8990

91+
const PopperManagerWrapper = ({
92+
children,
93+
popper,
94+
}: {
95+
children: ReactNode
96+
popper: boolean
97+
}) => {
98+
return popper ? <Manager>{children}</Manager> : <>{children}</>
99+
}
100+
90101
interface ContextProps extends CDropdownProps {
91102
// eslint-disable-next-line @typescript-eslint/no-explicit-any
92103
dropdownToggleRef: RefObject<any> | undefined
@@ -149,38 +160,30 @@ export const CDropdown = forwardRef<HTMLDivElement | HTMLLIElement, CDropdownPro
149160
!_visible && onHide && onHide()
150161
}, [_visible])
151162

152-
const DropdownContent = () => {
153-
return variant === 'input-group' ? (
154-
<>{children}</>
155-
) : (
156-
<Component
157-
className={classNames(
158-
variant === 'nav-item' ? 'nav-item dropdown' : variant,
159-
{
160-
'dropdown-center': direction === 'center',
161-
'dropup dropup-center': direction === 'dropup-center',
162-
direction: direction && direction !== 'center' && direction !== 'dropup-center',
163-
show: _visible,
164-
},
165-
className,
166-
)}
167-
{...rest}
168-
ref={forkedRef}
169-
>
170-
{children}
171-
</Component>
172-
)
173-
}
174-
175163
return (
176164
<CDropdownContext.Provider value={contextValues}>
177-
{popper ? (
178-
<Manager>
179-
<DropdownContent />
180-
</Manager>
181-
) : (
182-
<DropdownContent />
183-
)}
165+
<PopperManagerWrapper popper={popper}>
166+
{variant === 'input-group' ? (
167+
<>{children}</>
168+
) : (
169+
<Component
170+
className={classNames(
171+
variant === 'nav-item' ? 'nav-item dropdown' : variant,
172+
{
173+
'dropdown-center': direction === 'center',
174+
'dropup dropup-center': direction === 'dropup-center',
175+
direction: direction && direction !== 'center' && direction !== 'dropup-center',
176+
show: _visible,
177+
},
178+
className,
179+
)}
180+
{...rest}
181+
ref={forkedRef}
182+
>
183+
{children}
184+
</Component>
185+
)}
186+
</PopperManagerWrapper>
184187
</CDropdownContext.Provider>
185188
)
186189
},

0 commit comments

Comments
 (0)