CSS transition 不适用于 react-portal
CSS transition doesn't work with react-portal
我正在使用 react-portal
制作对话框并添加过渡效果,效果很好
// App.js
return (
<div className="App">
<button onClick={() => setIsOpen(true)}>Click to see dialog</button>
<PortalDialog isOpen={isOpen} setIsOpen={setIsOpen}>
This is content of dialog
</PortalDialog>
{/* animation works */}
</div>
)
//PortalDialog.js
return (
<Portal>
<DialogWrapper className={`${isOpen ? "active" : ""}`}>
{children}
<button onClick={() => setIsOpen(false)}>Close</button>
</DialogWrapper>
</Portal>
);
直到我注意到 PortalDialog
每次在渲染时创建,我不想要,所以我添加了一个条件
<div className="App">
<button onClick={() => setIsOpen(true)}>Click to see dialog</button>
{isOpen && (
<PortalDialog isOpen={isOpen} setIsOpen={setIsOpen}>
This is content of dialog
</PortalDialog> // animation doesn't work
)}
</div>
现在它不是每次都呈现,但 CSS 过渡不再起作用,我认为这是因为我添加的条件。但是我找不到用 react-portal
添加过渡的方法,我需要在这里做什么?我做了一个 codesandbox example here.
看起来 ReactTransitionGroup
是答案,我用 CSSTransition
组件包裹了我的 PortalDialog
组件,如他们的 codesandbox sample.
所示
<CSSTransition
in={isOpen}
timeout={300}
classNames="dialog"
unmountOnExit
>
<Portal>
<DialogWrapper>
{children}
<button onClick={() => setIsOpen(false)}>Close</button>
</DialogWrapper>
</Portal>
</CSSTransition>
过渡现在无需在每次渲染时都创建即可。
我正在使用 react-portal
制作对话框并添加过渡效果,效果很好
// App.js
return (
<div className="App">
<button onClick={() => setIsOpen(true)}>Click to see dialog</button>
<PortalDialog isOpen={isOpen} setIsOpen={setIsOpen}>
This is content of dialog
</PortalDialog>
{/* animation works */}
</div>
)
//PortalDialog.js
return (
<Portal>
<DialogWrapper className={`${isOpen ? "active" : ""}`}>
{children}
<button onClick={() => setIsOpen(false)}>Close</button>
</DialogWrapper>
</Portal>
);
直到我注意到 PortalDialog
每次在渲染时创建,我不想要,所以我添加了一个条件
<div className="App">
<button onClick={() => setIsOpen(true)}>Click to see dialog</button>
{isOpen && (
<PortalDialog isOpen={isOpen} setIsOpen={setIsOpen}>
This is content of dialog
</PortalDialog> // animation doesn't work
)}
</div>
现在它不是每次都呈现,但 CSS 过渡不再起作用,我认为这是因为我添加的条件。但是我找不到用 react-portal
添加过渡的方法,我需要在这里做什么?我做了一个 codesandbox example here.
看起来 ReactTransitionGroup
是答案,我用 CSSTransition
组件包裹了我的 PortalDialog
组件,如他们的 codesandbox sample.
<CSSTransition
in={isOpen}
timeout={300}
classNames="dialog"
unmountOnExit
>
<Portal>
<DialogWrapper>
{children}
<button onClick={() => setIsOpen(false)}>Close</button>
</DialogWrapper>
</Portal>
</CSSTransition>
过渡现在无需在每次渲染时都创建即可。