reactjs 在“@headlessui/react”中,如何将'Popover' 'open' prop传递给其父组件

bnl4lu3b  于 2023-10-17  发布在  React
关注(0)|答案(1)|浏览(131)

我正在使用“@headlessui/react”中的“Popover”组件&我想在弹出窗口打开/关闭时采取行动,而不更改默认的打开/关闭行为。
因此,我考虑将“Popover”组件的“open”属性传递给一个 Package 器组件&然后执行我想在useEffect中执行的fn。但我不确定我如何能做到这一点。
https://headlessui.dev/react/popover

lnlaulya

lnlaulya1#

听起来您对 Package 器组件的理解是正确的。但是,我建议将您想要执行的函数传递给popover,并在那里的useEffect中运行它。
下面是这个想法(基于Headless UI网站的一个例子):

import { useEffect } from 'react'
import { Popover } from '@headlessui/react'
import { ChevronRightIcon } from '@heroicons/react/solid'

function PopoverContent({ open, func }) {
  useEffect(() => {
    if (open) {
      func()
    }
  }, [ open ])

  return (
    <>
       <Popover.Button>
         <span>Solutions</span>
         <ChevronRightIcon
           className={`${open ? 'transform rotate-90' : ''}`}
         />
       </Popover.Button>

       <Popover.Panel>{/* ... */}</Popover.Panel>
    </>
  )
}
  

function MyPopover() {
  const functionToExecuteOnOpen = () => {
     // do something
  }

  return (
    <Popover>
      {({ open }) => (
        <PopoverContent
          open={open}
          func={functionToExecuteOnOpen}
        />
      )}
    </Popover>
  )
}

您可以删除useEffect中的if语句,如果希望每次open更改时(无论值如何)都运行该函数,则只需调用该函数。

相关问题