redux PigeonMap弹出窗口在MouseOver上无限渲染

4c8rllxm  于 2022-11-12  发布在  Pig
关注(0)|答案(1)|浏览(156)

当我把鼠标悬停在一个地理点标记上时,弹出窗口会出现,然后无限消失,直到我把鼠标从标记上移开。我的HandleMouseOver函数应该只显示一次弹出窗口,我不知道为什么它会循环多次:

const handleMarkerMouseOver = (args: any) => {
            console.log("arges", args)
        setPopoverVisible(true)
        setDoc(args.payload.doc_fields)
        setAnchor(args.anchor)
        setPopoverContent(args.payload.doc_fields['@service_address'])
    }

所有代码:

export function NewMap(props: any): ReactElement {
    const [anchor, setAnchor] = useState(undefined)
    const [popoverVisible, setPopoverVisible] = useState(false)
    const [popoverContent, setPopoverContent] = useState(undefined)
    const [doc, setDoc] = useState()

    const [showVisualDrawer, setShowVisualDrawer] = useState(false)
    const pageSizeInRedux = useAppSelector(selectPageSize)
    const mapFormData = props
    const mapData = useWaveWatcherEventsMapDataQuery({
        index: props.index,
        pageSize: pageSizeInRedux,
        body: props.body
    })

    let dataLength = 1
    if(mapData.data !== undefined) {
        dataLength = mapData?.data?.buckets?.map((t: { doc_count: any; }) => t.doc_count).reduce((a: any, b: any) => a + b, 0);
    }

    let waveContent: ReactElement = <></>

    if (mapData.isSuccess && dataLength > 1) {

        const handleMarkerClick = (args: any) => {
            setPopoverVisible(true)
            setDoc(args.payload.doc_fields)
            setAnchor(args.anchor)
            setPopoverContent(args.payload.doc_fields['@service_address']);
    }

    const handleMarkerMouseOut = (args: any) => {
        setPopoverVisible(false)
    }

    const handleMarkerMouseOver = (args: any) => {
            console.log("arges", args)
        setPopoverVisible(true)
        setDoc(args.payload.doc_fields)
        setAnchor(args.anchor)
        setPopoverContent(args.payload.doc_fields['@service_address'])
    }

    let center: any = [0, 0]
    const points = mapData.data.buckets.map((e: any, index: number) => {
            center = e.location.split(',').map((c: string) => (parseFloat(c))) || utilityCoordinates
            return (
                <Marker key={index}
                        width={20}
                        color={Color.darkblue}
                        anchor={center}
                        payload={e}
                        onClick={handleMarkerClick}
                        onMouseOut={handleMarkerMouseOut}
                        onMouseOver={handleMarkerMouseOver}
                />
            )
        }
    )

 return (
         waveContent = <>
             <MapStats data={mapData} mapFormData={mapFormData}/>
             <div className={styles.mapWrapper}>
                 <Map height={443} defaultCenter={center} defaultZoom={13}>
                     {points}
                     <ZoomControl/>
                     <Overlay anchor={anchor} offset={[0, 0]}>
                         <Popover
                             visible={popoverVisible}
                             content={popContent}
                             title={'Marker Details'}
                         >
                         </Popover>
                     </Overlay>
                 </Map>
             </div>

这是无限出现和消失的弹出窗口:

beq87vna

beq87vna1#

这可能有帮助,也可能没有帮助,但它似乎与我今天刚刚遇到的一个问题有关。我的弹出窗口会反复出现,然后又消失。罪魁祸首是加载的背景(类似于模态背景在后台中的加载方式),这样,我的组件就会认为我不再将鼠标放在它上面,然后它就会消失,然后它会认为我又在它上面,再次出现,等等...我最终只是用了一个MUI Popper而不是Popover。希望这有帮助。

相关问题