diff --git a/src/components/contextView/index.tsx b/src/components/contextView/index.tsx index 647d359c3..c16ffd0b2 100644 --- a/src/components/contextView/index.tsx +++ b/src/components/contextView/index.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { useEffect, useState } from 'react'; import { render as renderUtils, unmout } from 'mo/react/render'; import { classNames } from 'mo/common/className'; import { @@ -40,6 +40,24 @@ enum ContextViewEvent { const Emitter = new EventEmitter(); +/** + * It's a hook used in functional component + */ +export function useContextViewEle(props?: IContextViewProps) { + const [contextView, setContextView] = useState(); + + useEffect(() => { + // The useContextView can't be called at initial of useState + // Because this function has rendered an element + setContextView(useContextView(props)); + }, []); + + return contextView; +} + +/** + * TODO: It's not a hook, don't begin with use + */ export function useContextView(props: IContextViewProps = {}): IContextView { const { shadowOutline = true } = props; const claName = classNames(contextViewClass, 'fade-in'); diff --git a/src/components/dropdown/index.tsx b/src/components/dropdown/index.tsx index 2fc76e059..8fecd46a1 100644 --- a/src/components/dropdown/index.tsx +++ b/src/components/dropdown/index.tsx @@ -1,6 +1,6 @@ import React, { forwardRef, useImperativeHandle } from 'react'; import { classNames, getBEMModifier, prefixClaName } from 'mo/common/className'; -import { useContextView } from '../contextView'; +import { useContextViewEle } from '../contextView'; import { triggerEvent, TriggerEvent, @@ -30,7 +30,7 @@ export const DropDown = forwardRef( trigger = 'click', ...restProps } = props; - const contextView = useContextView({ + const contextView = useContextViewEle({ render: () => overlay, }); @@ -48,6 +48,7 @@ export const DropDown = forwardRef( ); const events = { [triggerEvent(trigger)]: function (e: React.MouseEvent) { + if (!contextView) return; const target = e.currentTarget; const rect = target.getBoundingClientRect(); let position = getPositionByPlacement(placement, rect); diff --git a/src/components/index.ts b/src/components/index.ts index 372170518..0439649fa 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -22,7 +22,7 @@ export type { ICollapseProps } from './collapse'; export { useContextMenu } from './contextMenu'; export type { IContextMenuProps } from './contextMenu'; -export { useContextView } from './contextView'; +export { useContextView, useContextViewEle } from './contextView'; export type { IContextViewProps, IContextView } from './contextView'; export { Modal } from './dialog'; diff --git a/src/provider/__tests__/__snapshots__/molecule.test.tsx.snap b/src/provider/__tests__/__snapshots__/molecule.test.tsx.snap index f4c710b1f..4cbf3957c 100644 --- a/src/provider/__tests__/__snapshots__/molecule.test.tsx.snap +++ b/src/provider/__tests__/__snapshots__/molecule.test.tsx.snap @@ -1234,6 +1234,17 @@ dmlldzJfOV8xNjM4ODQ4MDI1NDI2MTE4Ml8zOF9bMF0TNSl1AAAAAElFTkSuQmCC" + +