【发布时间】:2021-11-11 05:38:17
【问题描述】:
我用 react-spring 创建了这个 react Collapse 组件,它具有打开和关闭功能。
我想要一个 defaultOpen 道具,因此内容在初始渲染时保持打开状态,然后使用 isOpen 状态进行关闭和打开。
我该怎么做?
【问题讨论】:
标签: reactjs react-spring
我用 react-spring 创建了这个 react Collapse 组件,它具有打开和关闭功能。
我想要一个 defaultOpen 道具,因此内容在初始渲染时保持打开状态,然后使用 isOpen 状态进行关闭和打开。
我该怎么做?
【问题讨论】:
标签: reactjs react-spring
为此,您需要拥有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>
</>
)
}
工作示例:
【讨论】:
defaultValue 的组件,defaultValue 仅在您不为其提供实际值时才有效。包括原生 HTML 选择、单选或复选框元素。
如果您不想使用属性defaultOpen,请将其提供给 App 组件,如下所示:
export default function App({ defaultOpen = true }) {
const [isOpen, setIsOpen] = useState(defaultOpen)
return (
<Collapse isOpen={isOpen}>
...
</Collapse>
)
}
【讨论】: