返回

React 中 Collapse 组件:如何动态展开单个卡片?

javascript

在 React 中使用 Collapse 组件动态展开单个卡片

在构建 React 应用程序时,我们经常需要动态地显示和隐藏内容。一种实现此目的的流行方法是使用 Material UI 中的 Collapse 组件。然而,当涉及到仅展开单个卡片时,可能会遇到一些挑战。本文将逐步指导您解决此问题,并提供一个使用 Collapse 组件在 React 中动态展开单个卡片的完整代码示例。

问题

在使用 Collapse 组件时,我们可能会遇到这样的情况:当单击“显示更多”按钮时,整个可见列都会随之展开。这并不是我们想要的效果,因为我们只希望展开所选卡片的内容,而不是整个列。

解决方案

要解决此问题,我们需要采用以下步骤:

1. 导入 Collapse 组件

首先,我们需要导入 Collapse 组件。

import { Collapse } from "@mui/material";

2. 创建状态变量

接下来,我们需要使用 useState 钩子创建一个布尔状态变量,名为 isExpanded,用于跟踪卡片是否展开。

const [isExpanded, setIsExpanded] = useState(false);

3. 处理按钮点击事件

为“显示更多”按钮添加一个 onClick 处理程序,以切换 isExpanded 状态。

<Button onClick={() => setIsExpanded(!isExpanded)}>...</Button>

4. 使用 Collapse 组件

我们将 Collapse 组件包装在卡片的 CardActions 部分中,并在 in 属性中使用 isExpanded 状态。

<Collapse in={isExpanded} timeout="auto" unmountOnExit>...</Collapse>

5. 设置动画和样式

最后,我们可以使用 Collapse 组件的 timeoutunmountOnExit 属性来控制展开和折叠动画。

完整代码示例

import React, { useState } from "react";
import { Collapse } from "@mui/material";
import Card from "@mui/material/Card";
import CardActions from "@mui/material/CardActions";
import CardContent from "@mui/material/CardContent";
import Button from "@mui/material/Button";

const Product = ({ name, description, price, rating }) => {
  const [isExpanded, setIsExpanded] = useState(false);

  return (
    <Card>
      <CardContent>
        <Typography variant="h5" component="div">
          {name}
        </Typography>
        <Typography sx={{ mb: "1.5rem" }} color="text.secondary">
          ${price}
        </Typography>
        <Rating value={rating} readOnly />
        <Typography variant="body2">{description}</Typography>
      </CardContent>
      <CardActions>
        <Button
          variant="primary"
          size="small"
          onClick={() => setIsExpanded(!isExpanded)}
        >
          See More
        </Button>
      </CardActions>
      <Collapse in={isExpanded} timeout="auto" unmountOnExit>
        <CardContent>
          <Typography>Additional information...</Typography>
        </CardContent>
      </Collapse>
    </Card>
  );
};

注意事项

  • 确保只初始化一次 isExpanded 状态变量。
  • timeout 属性控制展开和折叠动画的持续时间。
  • unmountOnExit 属性在折叠时卸载组件,以提高性能。

常见问题解答

Q:为什么 Collapse 组件没有在单击“显示更多”按钮时展开?
A: 确保已正确导入 Collapse 组件,并且 isExpanded 状态已正确用于 Collapse 组件的 in 属性。

Q:为什么折叠动画很慢?
A: 调整 Collapse 组件的 timeout 属性以缩短动画持续时间。

Q:如何禁用折叠动画?
A: 设置 timeout 属性为 0 以立即折叠和展开组件。

Q:Collapse 组件是否在折叠时卸载内容?
A: 默认情况下,Collapse 组件在折叠时会卸载内容。可以设置 unmountOnExit 属性为 false 以保留内容。

Q:Collapse 组件是否支持嵌套?
A: 是的,Collapse 组件可以嵌套以创建复杂的可折叠结构。

结论

通过使用 Collapse 组件和管理 isExpanded 状态,您现在可以动态地展开单个卡片,从而为您的 React 应用程序提供更灵活和用户友好的体验。希望本指南能帮助您克服您遇到的挑战,并使您能够创建美观且功能强大的用户界面。