为 React Collapse 组件添加默认打开逻辑

Add default open logic for a react Collapse component

我使用 react-spring 创建了这个具有打开和关闭功能的 React Collapse 组件。

我想要一个 defaultOpen 道具,这样内容在初始渲染时保持打开状态,然后它使用 isOpen 状态来关闭和打开.

我该怎么做?

这里是一个codesandbox link: https://codesandbox.io/s/awesome-fire-wsvml

为此,您需要 Collapsible 组件自己的状态

并从父组件传defaultOpen

像这样:

const Collapse = ({ defaultOpen = false, children }) => {
  const [isOpen, setIsOpen] = useState(defaultOpen)
  const [ref, { height: viewHeight }] = useMeasure()
  const { height, opacity } = useSpring({
    from: { height: 0, opacity: 1 },
    to: {
      height: isOpen ? viewHeight : 0,
      opacity: isOpen ? 1 : 0,
    },
  })

  return (
    <>
      <button onClick={() => setIsOpen(isOpen => !isOpen)}>{isOpen ? 'close' : 'open'}</button>
      <Content style={{ opacity, height }}>
        <a.div ref={ref}>{children}</a.div>
      </Content>
    </>
  )
}

工作示例:

如果您不想使用 属性 defaultOpen,请像这样将其提供给 App 组件:

export default function App({ defaultOpen = true }) {
  const [isOpen, setIsOpen] = useState(defaultOpen)

  return (
    <Collapse isOpen={isOpen}>
      ...
    </Collapse>
  )
}