在 Reactstrap 中使整张卡片可点击

Making whole card clickable in Reactstrap

我正在尝试创建一张卡片,当点击该卡片时,它会执行一个操作。

我已经通过向卡片添加一个按钮来完成这项工作,该按钮绑定到一个事件处理程序,并且按预期工作。

我试图让整个卡片使用相同的事件处理程序,而不是使用按钮,但我似乎无法像我期望的那样工作。

const SiteCard = props => {
  const { site, siteSelectedCallback } = props;

  return (
    <Card onClick={siteSelectedCallback} className="card-item">
      <CardBody>
        <CardTitle>{site.name}</CardTitle>
        <CardText className="text-muted">{site.address}</CardText>
        <Button color="primary" className="float-right" value={site.id}>
         CHOOSE ME
        </Button>
      </CardBody>
    </Card>
  );
};

我试过将它包装在 <a> 标签中,但这也不起作用。

在这个例子中,我希望卡片是可点击的,但实际上按钮仍然与事件处理程序一起工作。我也试过删除按钮,但这并不能使卡片可点击。

请注意,在 Card 组件上添加 onClick 足以使其可点击。更改 cursor through 样式使其对用户更加明显。

<Card onClick={onClick} style={{ cursor: "pointer" }}>
  <CardBody>This is a clickable card.</CardBody>
</Card>

a 标签包裹卡片也可以,但是,如果没有 href 则不会有指针光标,可以使用 CSS 轻松更改。

const SiteCard = ({ site, siteSelectedCallback }) => (
  <a style={{ cursor: 'pointer' }} onClick={siteSelectedCallback}>
    <Card className="card-item">
      <CardBody>
        <CardTitle>{site.name}</CardTitle>
        <CardText className="text-muted">{site.address}</CardText>
      </CardBody>
    </Card>
  </a>
);

刚刚用 console.log 测试了它,所以如果它不起作用,那是因为回调没有像您期望的那样工作。


另一种方法是通过传递 tag 属性使 Card 成为 a 标签。

<Card tag="a" onClick={siteSelectedCallback} style={{ cursor: "pointer" }}>

所有可用选项都在 source of the reactstrap's Card component 中明确定义。


我也用 Card 里面的按钮测试过没有任何问题。

万一有人来到这里是为了同样的问题,但是react-bootstrap's Card,解决方案非常相似。但是,您需要使用 as.

而不是 tag 属性
<Card as="a" onClick={siteSelectedCallback} style={{ cursor: "pointer" }}>