我正在try 创建一个组件,该组件在单击时将显示其子组件(S).

我有这样的代码:

type ExpandCollapseProps = ComponentProps<"div"> & VariantProps<typeof expandCollapseStyles> & {
    previewText?: string;
    children: React.ReactNode;
}

export const ExpandCollapse = forwardRef<HTMLDivElement, ExpandCollapseProps>(({ variant, className, children, previewText, ...props }, ref) => {

    const [expanded, setExpanded] = useState<boolean>(false);

    return (
        <div className={cn(expandCollapseStyles({ variant, className }))} ref={ref} {...props} onClick={() => setExpanded(!expanded)}>
            <div className="space-y-2">
                <p className="font-medium">{previewText}</p>

                {expanded &&
                    <div className="">
                        {children}
                    </div>
                }

            </div>
        </div>
    )
});

这工作得很好,点击它实际上会展开/折叠所需的组件.然而,我想使这是一个平稳的过渡,使组件滑下和/或淡入可见性.

解决这一问题的最佳方式是什么?

附带信息:

以下是我在css/Styling (in case anyone knows a solution perhaps utilizing these)中使用的包:

⚠️ I do not want to install an external component package that will complete the task for me. I'm trying to learn how to create reusable UI components on my own.

谢谢!

推荐答案

Short Explanation about Animating Conditionally rendered elements

卸载/挂载组件会使其更难设置动画 元素.虽然从技术上讲,您可以通过为元素设置一个键并为该元素编写一个CSS动画来实现这一点,但在卸载该元素时很难对其进行动画处理.

同时,您还可以查看Framer Motion来设置组件的退出和进入的动画.

这里有另一种方法可以帮助你解决这个问题.


而不是挂上和卸载子元素.您可以将它们包装在容器中,并根据您的可见和隐藏条件适当地设置它们的样式.您仍然可以在没有条件的情况下渲染子对象,但您可以根据条件更改样式.

下面是一个简单的示例,它使用TailWind和CLSX有条件地将样式应用于子对象.您可以进行定制以实现所需的动画效果.

import clsx from 'clsx';

function Component() {
    const [isExpanded, setExpanded] = useState<boolean>(false);

    return (
      <div>
        {/* Other siblings */}
            <div className={clsx('max-h-0 transition-all ...', // default classes
                isExpanded && 'max-h-[100px]' // classes when expanded
            )}>{children}</div>
      </div>
    );
}

我们使用最大高度属性来动画组件的展开/折叠.下面是W3学校关于如何创建动画可折叠的示例:https://www.w3schools.com/howto/howto_js_collapsible.asp.

它有一个很好的方法来设置最大高度.它不是 Select 一个固定值,而是更加动态,并使用内容的滚动高度.

Reactjs相关问答推荐

Redux Provider Stuck甚至彻底遵循了文档

REACTJS:在Reaction中根据路由路径更改加载器API URL

更改购物车中的产品数量后,PayPal Reaction/Next JS按钮未更新

如何通过回调函数获取多个值?

每次单击按钮时,Reaction组件都会重新生成

试图从Amazon-Cogito-Identity-js模拟CogitoUser.authateUser,并将其获取为未定义的S

使用Ionic 7和React 18,如何访问历史对象以在页面之间导航?

取消 Select 较高组件中的所有行

shadcn输入+窗体+Zod;一个部件正在改变要被控制的不受控制的输入;

StrictMode+SetInterval=双重渲染(即使使用useEffect清理)

无法在 NextJS 中获取嵌套对象

Chart.js如何go 除边框

useEffect 和 ReactStrictMode

我无法通过 useContext 显示值

如何在 React.js 中提取 PDF 的内容?

类型错误:类型typeof import(js-cookie)上不存在属性get

React Final Form - 单选按钮在 FieldArray 中不起作用

更新和删除功能不工作 Asp.net MVC React

设置 Material UI 表格默认排序

运行开发服务器时如何为 Vite 指定运行时目录